从void指针中推断出一个类型

Dig*_*ggy 3 c++ void-pointers

请考虑以下示例:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

是否可以仅使用MyContainer::Get函数返回的void指针来推断类型?可以使用演员表,模板和typeid操作员的任意组合来完成吗?

Set*_*gie 9

不,void*s绝对没有与它们相关的信息,当你把指针指向a时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);
Run Code Online (Sandbox Code Playgroud)

但我不知道在不知道你想要做什么的情况下会有多少帮助.你可能不得不诉诸一些更先进的东西boost::any.