Тот факт, что type_info
не менее сопоставим, не является такой же проблемой для его использования, как ключ карты, как тот факт, что type_info
не подлежит копированию.: -)
В C ++ 03 type_info
имеет функцию-член before()
, обеспечивающую упорядочение type_info
объектов.
В C ++ 11, type_info
имеет hash_code()
функцию-член (C ++ 11 §18.7.1 / 7):
size_t hash_code() const throw();
Возвращает: неопределенное значение, за исключением того, что в пределах одного выполненияпрограммы, он должен возвращать одно и то же значение для любых двух type_info
объектов, которые сравниваются равными.
Примечание: реализация должна возвращать разные значения для двух type_info
объектов, которые несравните равные.
type_info
объекты, полученные из оператора typeid
, существуют до конца программы, поэтому можно безопасно использовать type_info*
в качестве ключа карты.Однако, насколько мне известно, нет гарантии, что если вы примените typeid
к двум объектам одного типа, вы получите две ссылки на один и тот же объект type_info
.
Если вы используете type_info*
в качестве ключа карты, я бы использовал собственный компаратор, который разыменовывает указатели и сравнивает сами объекты type_info
(используя вышеупомянутые before()
или hash_code()
для упорядочения).