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