Лучшая альтернатива для использования оператора typeid - PullRequest
2 голосов
/ 19 января 2020

Хотелось бы узнать, какой способ лучше всего сравнивать typeide. Или есть какая-то разница между ними:

  1. typeid(std::string&) == typeid(std::string{""})
  2. typeid(std::string) == typeid(std::string{""})

Как результат, они оба верны, но я хотел бы знать, есть ли что-то «более глубокое», чтобы знать.

Ответы [ 2 ]

7 голосов
/ 19 января 2020

Стандарт читает [expr.typeid]:

Когда typeid применяется к идентификатору типа , результат относится к std​::​type_­info объект, представляющий тип type-id . Если тип type-id является ссылкой на возможно cv-квалифицированный тип, результат выражения typeid ссылается на std​::​type_­info объект, представляющий неквалифицированный cv ссылочный тип.

Из этой цитаты следует, что оба сравнения эквивалентны.

1 голос
/ 19 января 2020

Отличный и хороший документ ответ от Evg говорит вам, что оба эквивалентны.

Но вы также спросили, есть ли что-то более глубокое, чтобы знать. И да, есть:

  • При сравнении двух typeid name() вы должны знать, что разные типы могут иметь одинаковое строковое представление. Таким образом, даже если ваше равенство истинно, вы не можете быть уверены, что это действительно одинаковые типы с обеих сторон.
  • В обратном направлении различные операции typeid для выражений одного типа могут возвращать разные ссылки type_info. Таким образом, сравнивая адрес двух typeid, вы не можете быть уверены, что это два разных типа.

Так что, если вы хотите использовать typeid для сравнения типов времени выполнения, вы должны go для его hash_code() (который гарантированно даст то же значение для два одинаковых типа, которые должны давать разные значения для разных типов, согласно ненормативному примечанию в стандарте). Или, что еще лучше, просто сравните сами typeid с ==, как предлагает Artyer в комментариях.

...