Мне подумалось, может 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)]);
}
Спасибо,
Н.
Это работает, в том смысле, что a2
имеет то же значение, что и a
,
Это не обязательно «безопасно». Например, если a
указал на экземпляр некоторого производного класса A
, затем a2
не будет гарантировано иметь то же значение, что и a
, Таким образом, безопасность зависит от того, что вы подразумеваете под «отказом от обычных мер предосторожности». Вы не можете отказаться от «предосторожности», если вы преобразуете указатель в void*
тогда вам нужно преобразовать его обратно в исходный тип.
Других решений пока нет …