Я знаю, что компиляторы имеют большую свободу в реализации поведения std::type_info
функций.
Я подумываю использовать его для сравнения типов объектов, поэтому хочу быть уверенным, что:
std::type_info::name
должен возвращать две разные строки для двух разных типов.std::type_info::before
должен указать, чтоType1
передType2
исключающее илиType2
передType1
.// 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 ) ); }
Является ли это приемлемым (и стандартным) способом реализации такого оператора?