Я знаю, что компиляторы имеют большую свободу в реализации поведения функций std::type_info.
Я собираюсь использовать его для сравнения типов объектов, поэтому я хотел бы быть уверен, что:
-
std::type_info::nameдолжен возвращать две разные строки для двух разных типов. -
std::type_info::beforeдолжен сказать, чтоType1доType2исключение - илиType1передType2.// like this: typeid(T1).before( typeid(T2) ) != typeid(T2).before( typeid(T1) ) -
Две разные специализации одного и того же класса шаблонов считаются разными типами.
-
Два разных типа
typedefодного типа - это один и тот же тип.
И наконец:
-
Так как
std::type_infoне копируется, как я могу хранитьtype_infoгде-нибудь (например: вstd::map)? Единственный способ иметьstd::type_infoвсегда где-нибудь (например: в стеке или в статической/глобальной переменной) и использовать указатель на него? -
Насколько быстрые
operator==,operator!=иbeforeдля большинства распространенных компиляторов? Думаю, они должны сравнивать только значение. И как быстроtypeid? -
У меня есть класс
Aсvirtual bool operator==( const A& ) const. ПосколькуAимеет много подклассов (некоторые из которых неизвестны во время компиляции), я бы перегрузил этот виртуальный оператор в любом подклассеBследующим образом:virtual bool operator==( const A &other ) const { if( typeid(*this) != typeid(other) ) return false; // bool B::operator==( const B &other ) const // is defined for any class B return operator==( static_cast<B&>( other ) ); }Является ли это приемлемым (и стандартным) способом реализации такого оператора?