Я знаю, что компиляторы имеют большую свободу в реализации поведения функций 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 ) ); }
Является ли это приемлемым (и стандартным) способом реализации такого оператора?