从空指针中推导一个类型

Deduce a type from a void pointer

本文关键字:一个 类型 空指针      更新时间:2023-10-16

考虑以下示例:

class MyContainer {
    std::vector<void *> v;
public:
    void Put(void *x) { v.push_back(x);}
    void* Get(int index) { return v[index];}
};
void Work (MyContainer& c) {
    // cast_to_type(c.Get(0));
}
int main() {
    int x = 1;
    double y = 2.0;
    MyContainer c;
    c.Put(&x);
    c.Put(&y);
    Work(c);
    return 0;
}

假设函数Work对向量指针指向的对象一无所知。还假设继承不是一个选项,并且指向的对象的类型可以是任意的(可以有无限数量的类型)。

是否可以仅使用MyContainer::Get函数返回的void指针来推导类型?这可以使用强制转换、模板和typeid运算符的任何组合来完成吗?

不,void*绝对没有与它们相关的任何信息,当您将指针投射到void*时,您将完全丢失类型。您必须找到另一种方法将不同类型存储在同一容器中,例如使用继承。

你也可以这样做:

class MyContainer {
    struct cont {
        void* ptr;
        type_info* ti; // pointer, not reference, so this struct can be copied
    };
    std::vector<cont> v;
public:
    template<typename T>
    void Put(T* x) {
        v.push_back({ x, &typeid(T) });
    }
    // do whatever you want with Get using *v[x].ti
};
int x = 1;
double y = 2.0;
MyContainer c;
c.Put(&x);
c.Put(&y);
Work(c);

但如果不知道自己在做什么,我不知道这会有多大帮助。你可能不得不求助于boost::any这样更先进的东西。

相关文章: