Я все еще работаю над хорошим решением моей проблемы с контейнером типа «один в своем роде» - и, подумав, думаю, было бы неплохо может просто использовать что-то вроде std :: map
. К сожалению, std :: type_info
не определяет оператор , и я думаю, что было бы неразумно определять его.
Однако представляется разумным определить хэш-функция для него, потому что вы можете просто использовать одноэлементный адрес объекта std :: type_info
в качестве разумного «хеша». Следовательно, вы сможете поместить std :: type_info
в std :: unordered_map
в качестве ключа.
Предоставляет ли C ++ 11 такую хеш-функцию? Будет ли использование адреса памяти синглтона std :: type_info
плохой хэш-стратегией?
Тот факт, что 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 бросать();
Возвращает: неуказанное значение, за исключением того, что в рамках одного выполнения программы оно должно возвращать одно и то же значение для любых двух объектов
type_info
, которые сравниваются одинаково.Примечание: реализация должна возвращать разные значения для двух объектов
type_info
, которые не сравниваются друг с другом. Объекты
type_info
, полученные в результате оператора typeid
, существуют до конца программы, поэтому безопасно использовать type_info *
в качестве ключа карты. Однако, насколько мне известно, нет никакой гарантии, что если вы примените typeid
к двум объектам одного типа, вы получите две ссылки на один и тот же объект type_info
.
Если вы действительно используете type_info *
в качестве ключа карты, я бы использовал настраиваемый компаратор, который разыменовывает указатели и сравнивает сами объекты type_info
(используя вышеупомянутый before ()
или hash_code ()
для заказа).