Предоставляет ли C ++ 11 хеш-функции для std :: type_info? - PullRequest
8 голосов
/ 24 августа 2010

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

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

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

Ответы [ 2 ]

11 голосов
/ 19 ноября 2012

Вы также можете использовать type_index , он безопасно хранит указатель на type_info, он копируемый, сопоставимый, и для стандартных контейнеров предусмотрена хэш-функция.

8 голосов
/ 24 августа 2010

Тот факт, что 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() для упорядочения).

...