为什么使用std :: type_index而不是std :: type_info *

时间:2013-11-16 19:09:01

标签: c++ c++11 rtti

我需要按类型键入地图中的某些数据。目前我有这样的事情:

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之外还有其他原因吗?

2 个答案:

答案 0 :(得分:22)

type_index是“type_info的一个简单包装器,可用作关联容器(23.4)和无序关联容器(23.5)中的索引类型”。如果您使用type_index代替type_info*,则可以免于在地图中提供明确的比较器。唯一的代价是您需要#include <typeindex>

另一个好处是它允许你切换到(或者也使用)hashmaps(又名unordered_maps)。

总的来说,由于它简化了代码,我会说“去吧”。

答案 1 :(得分:6)

我不认为使用指向typeid(x)返回的结果的指针始终会产生相同的结果。特别是在使用共享库时保证返回相同的对象似乎是有问题的。 std::type_info用于排序的预期用途是使用before()成员。类std::type_index将它包装成一个模拟器接口。