我想知道typeid
是否是一个“足够硬”的类型安全标准,以放弃所有常用的预防措施。具体来说,请考虑以下代码段:
class storage
{
private:
std::map<std::type_index, void*> objects;
public:
template<typename T>
void put(T* ptr)
{
objects[typeid(*ptr)] = ptr;
}
};
storage stor;
ClassA* a = new ClassA();
ClassB* b = new ClassB();
stor.put(a);
stor.put(b);
使用typeid
?
template<typename T>
T* storage::get()
{
return static_cast<T*>(objects[typeid(T)]);
}
谢谢, Ñ
答案 0 :(得分:1)
在a2
与a
具有相同价值的意义上,它有效。
它不一定是“安全的”。例如,如果a
指向某个派生类A
的实例,则a2
将无法保证与a
具有相同的值。所以安全取决于你所说的“放弃通常的预防措施”。您不能放弃“预防措施”,如果您将指针转换为void*
,则需要将其转换回原始类型。