Предоставляет ли C ++ 11 функции хеширования для std :: type_info?

Я все еще работаю над хорошим решением моей проблемы с контейнером типа «один в своем роде» - и, подумав, думаю, было бы неплохо может просто использовать что-то вроде std :: map . К сожалению, std :: type_info не определяет оператор , и я думаю, что было бы неразумно определять его.

Однако представляется разумным определить хэш-функция для него, потому что вы можете просто использовать одноэлементный адрес объекта std :: type_info в качестве разумного «хеша». Следовательно, вы сможете поместить std :: type_info в std :: unordered_map в качестве ключа.

Предоставляет ли C ++ 11 такую ​​хеш-функцию? Будет ли использование адреса памяти синглтона std :: type_info плохой хэш-стратегией?

8
задан Community 23 May 2017 в 11:58
поделиться

1 ответ

Тот факт, что 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 () для заказа).

9
ответ дан 5 December 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: