为什么使用std::type_index而不是std::type _info*
Why use std::type_index instead of 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
之外,还有什么原因吗?
type_index
是"type_info的一个简单包装器,它可以在关联容器(23.4)和无序关联容器(23.5)中用作索引类型"。如果使用type_index
而不是type_info*
,您将不必在映射中提供显式比较器。唯一的成本是你需要#include <typeindex>
。
另一个好处是,它将允许您切换到(或同时使用)哈希映射(也称为unrdered_maps)。
总的来说,由于它简化了您的代码,我会说"去做吧"。
我不认为使用指向typeid(x)
返回的结果的指针可以保证总是产生相同的结果。特别是,在使用共享库时,保证返回相同的对象似乎有问题。std::type_info
用于排序的预期用途是使用before()
成员。类std::type_index
将其封装到一个simoler接口中。
相关文章:
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- C++ "错误:在'类 std::result_of< ... >"中没有名为'type'的类型"
- 如何解决"'mutex' in namespace 'std' does not name a type"?
- 如何摆脱导入的 make 项目中的 Eclipse 索引器"Type std::... could not be resolved"错误
- clang C++17 std::vector over align type 使用 -mavx 编译时元素 SIGSE
- std::make_shared<Type> 会产生内存泄漏
- 使用 std::type T 的数组来构造可从 T 构造的 std::数组
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 检测<T>某些非数字类型 T 的 std::numeric::type 的特化
- 修复第三方代码:"error: ‘enable_if’ in namespace ‘std’ does not name a template type"
- 错误 C2893 无法专门化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...)'
- 无法专用化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)'
- 初始化有关Google C 样式指南的静态字符串(C-Type或STD :: String)
- 使用 std::array<Type, N> 的实例作为模板参数
- "The C++ Library doesen't provide a hash for this type." - 在 std::unordered_map 中使用自己的类
- 我收到一个" conversion from ‘std::string (*)[50]’ to non-scalar type ‘std::string’ requested"错误,似乎无法修复它
- GCC vs. Clang:"invalid use of incomplete type" std::d eclval 和模板专业化
- prvalue of type std::nullptr_t
- 获取"terminating with uncaught exception of type std::length_error: vector"错误C++