Подтвердить что ты не робот

Зачем использовать std:: type_index вместо std:: type_info *

Мне нужно указать некоторые данные на карте по типу. В настоящее время у меня есть что-то вроде этого:

struct TypeInfoComparer
{
  bool operator()(std::type_info const* a, std::type_info const* b) const
  {
    return a->before(*b);
  };
};

std::map<std::type_info const*, Foo, TypeInfoComparer> d_fooByTypeId;

Из чего я могу перейти от использования (например, в методе шаблона с <typename T>:

auto pair = d_fooByTypeId.find(&typeid(T));

Однако сегодня я читал о std::type_index, который, как представляется, предназначен для использования в таком случае, как это.

Я заинтересован в улучшении моего знания на C++. Может ли кто-нибудь объяснить, следует ли мне изменить код для использования std::type_index и почему? Есть ли причина, по которой вы не можете удалить TypeInfoComparer?

4b9b3361

Ответ 1

type_index является "простой оболочкой для type_info, которая может использоваться как тип индекса в ассоциативных контейнерах (23.4) и в неупорядоченных ассоциативных контейнерах (23.5)". Если вы используете type_index вместо type_info*, вы освободите себя от необходимости предоставлять явный компаратор на ваших картах. Единственная стоимость - вам нужно #include <typeindex>.

Другим преимуществом является то, что он позволит вам переключиться на (или также использовать) hashmaps (aka unordered_maps).

В целом, поскольку он упрощает ваш код, я бы сказал "пойдите для него".

Ответ 2

Я не думаю, что использование указателя на результат, возвращаемый из typeid(x), всегда будет давать тот же результат. В частности, представляется проблематичным гарантировать, что тот же объект будет возвращен при использовании разделяемых библиотек. Предпочитаемое использование std::type_info для сортировки состоит в использовании члена before(). Класс std::type_index обертывает это в интерфейс simoler.