考虑以下示例:
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
运算符的任意组合来完成吗?
答案 0 :(得分:9)
不,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
那样更先进的东西。