【发布时间】:2012-03-19 13:54:25
【问题描述】:
考虑以下示例:
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 运算符的任意组合来完成吗?
【问题讨论】:
-
简答:否。
-
如果我使用模板来包装对象,然后将指针指向被包装的对象呢?我可以使用模板以某种方式保存有关类型的信息吗?
-
@Diggy:不是直接的,但您现在可以通过这个包装器应用继承。见
boost::any。 -
@Diggy - 是的,但是你并没有真正使用
void *指针。void *暗示它实际上可以指向任何东西。无论如何,您使用的任何模板解决方案最终都会重新发明boost::any或类似的东西。
标签: c++ void-pointers