我需要按类型键入地图中的某些数据。目前我有这样的事情:
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
之外还有其他原因吗?
答案 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
将它包装成一个模拟器接口。