В чем преимущество использования std :: type_info :: hash_code над std :: type_index - PullRequest
0 голосов
/ 02 мая 2020

Является ли единственное отличие, которое можно использовать в качестве индекса?

В чем преимущество использования одного над другим для сравнения типов?

Ответы [ 3 ]

0 голосов
/ 02 мая 2020

std::type_info::hash_code() - это функция-член, которая возвращает std::size_t. Это просто число, вы не можете получить name из std::type_info из него.

std::type_index - это тип, совместимый с контейнерами, который также имеет член name, ссылаясь на индекс std::type_info, который он индексирует.

0 голосов
/ 02 мая 2020

Как и в случае любых ха sh, возможны коллизии :

Возвращает неопределенное значение, так что для всех type_info объектов, относящихся к одному и тому же типу, их hash_code() - то же самое.

Других гарантий не дано: type_info объекты, относящиеся к разным типам, могут иметь одинаковые hash_code (хотя стандарт рекомендует, чтобы реализации избегали этого в максимально возможной степени), и hash_code для одного и того же типа может меняться между вызовами одной и той же программы.

( ref )

(последняя фраза особенно интересно.)

Какая из двух функций вы хотите использовать, зависит от того, что вы пытаетесь сделать. Как правило, type_index() это то, что вы ищете. Он однозначно идентифицирует тип. Если вам нужен ключ для ассоциативного контейнера, эффективный хеш-код type_index() равен hash_code().

Я не могу придумать причину, по которой вам когда-либо понадобится использовать hash_code() самостоятельно, если только вы по какой-то причине не пытаетесь избежать type_index() (или вы обнаружите, что вам нужно указать хешер самостоятельно), хотя в статье по ссылке есть пример такой реализации.

0 голосов
/ 02 мая 2020

С cppreference :

Выражение typeid представляет собой выражение lvalue , которое относится к объекту с длительностью хранения stati c, полиморфи c type const std :: type_info или некоторого производного от него типа.

Класс type_index - это класс-оболочка вокруг объекта std :: type_info, который можно использовать в качестве индекса в ассоциативных и неупорядоченных ассоциативных контейнерах , Связь с объектом type_info поддерживается через указатель, поэтому type_index имеет значение CopyConstructible и CopyAssignable .

...