Достаточно ли 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)]);
}

Спасибо,
Н.

1

Решение

Это работает, в том смысле, что a2 имеет то же значение, что и a,

Это не обязательно «безопасно». Например, если a указал на экземпляр некоторого производного класса A, затем a2 не будет гарантировано иметь то же значение, что и a, Таким образом, безопасность зависит от того, что вы подразумеваете под «отказом от обычных мер предосторожности». Вы не можете отказаться от «предосторожности», если вы преобразуете указатель в void* тогда вам нужно преобразовать его обратно в исходный тип.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]