Мне было интересно, если typeid
является «достаточно жестким» критерием безопасности типа, чтобы отказаться от всех обычных мер предосторожности. В частности, рассмотрим следующий фрагмент кода:Является ли 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)]);
}
Спасибо, Н.
Поскольку 'ClassA' и' ClassB' могут быть _implicitly_ преобразованы в 'void *', вам не нужно использовать 'static_cast' для хранения их на карте. –
Я хотел прояснить, что такое конверсии, но соответствующим образом отредактировал пример. – nes
Я также отредактировал пример, чтобы указатели сохранялись под их реальным типом 'typeid (* ptr)' для предотвращения проблем с абстрактными базовыми классами. – nes