Зачем использовать 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
?
Ответы
Ответ 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.