2013-11-16 5 views
21

Мне нужно указать некоторые данные на карте по типу. В настоящее время у меня есть что-то вроде этого:Зачем использовать 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, который, кажется, предназначено для использования в таком случае, как это.

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

+1

Почему, по вашему мнению, 'type_info', возвращаемый' typeid', является постоянным и уникальным для данного типа? – Yakk

+6

@Yakk: «Результатом выражения typeid является lvalue статического типа const std :: type_info ... Время жизни объекта, на которое ссылается значение lvalue, продолжается до конца программы». ([Expr.typeid]). Он не предполагает, что он уникален; он использует стандартную функцию 'before' member в своем компараторе. Я не знаю, почему все пропускают этот факт. – rici

ответ

19

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

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

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

+2

и нет оснований использовать «карту», ​​поскольку порядок 'before' является произвольным. – Yakk

3

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

+0

* «Я не думаю, что использование указателя на результат, возвращаемый из typeid (x), гарантированно всегда дает тот же результат» * ... Ну, по спецификации, гарантируется, что тот же * объект каждый раз, когда вы используете 'typeid (x)'. – Nawaz

Смежные вопросы