std::type_index是否唯一?用于std::map存储类型信息的疑问
std::type_index 是否能保证唯一区分不同类型?
答案是肯定的,std::type_index可以唯一对应不同的类型,完全适合用在std::map中作为键来区分不同类型的信息。
核心原因:
- std::type_index内部封装了std::type_info的引用,它的比较逻辑(包括用于std::map的
<运算符、==运算符)直接依赖std::type_info本身的类型判断:- 两个std::type_index相等,当且仅当它们指向的是同一个std::type_info对象,也就是对应完全相同的类型。
- 这和std::type_info::hash_code()是否唯一无关——hash_code只是类型的哈希值,可能存在碰撞,但std::type_index不会用它来判断类型是否相同。
对你的示例代码的说明:
你的代码思路完全可行,不过注意语法修正:type_index[typeid(A)]的写法错误,应该用构造函数形式std::type_index(typeid(A)),修正后的代码如下:
#include <typeindex> #include <map> #include <string> class A{}; class B{}; int main() { std::map<std::type_index, std::string> info{ {std::type_index(typeid(A)), "Information for class A."}, {std::type_index(typeid(B)), "Information for class B."} }; }
在这个修正后的代码中,A和B对应的std::type_index会被std::map视为完全不同的键,不会出现键冲突或类型混淆的问题。
补充:关于hash_code的误区
虽然std::type_info::hash_code()可能存在不同类型哈希值相同的情况,但这不会影响std::type_index的正确性:
- 如果使用std::unordered_map<std::type_index, ...>,哈希碰撞只会影响哈希桶的分布,但最终的相等性判断还是会通过std::type_info的
==来确认,不会把不同类型当成同一个键。 - 而你使用的std::map是基于有序比较的,它通过std::type_index的
<运算符(底层调用std::type_info::before())来排序,不同类型的std::type_index必然能被正确区分。
内容的提问来源于stack exchange,提问作者sixsixqaq
相关产品推荐
相关产品推荐

