C++11 - typeid uniqueness
C++11 - typeid uniqueness
在C++11中,我使用这个
typeid(T).name()
用于我自己的哈希计算。我不需要程序运行或编译之间的结果相同。我只需要它是独一无二的类型。我知道,它可以为不同的类型返回相同的名称,但通常带有常量、指针等。在我的情况下,T
只是class XY
、struct XX
或派生类型。
在这种情况下,我可以假设T
是唯一的吗?
您应该使用std::type_index
进行映射。
type_index类是一个围绕std::type_info的包装类对象,可以在关联和无序中用作索引关联容器。与type_info对象的关系为通过指针维护,因此type_index是CopyConstructable和CopyAssignable。
std::type_info::name
是实现定义的,因此不应该依赖于它对不同类型的唯一性。
由于您这样做是为了进行哈希计算,因此应该使用std::type_info::hash_code
。尽管这并不能保证值是唯一的,但该标准规定,实现应该尝试为不同类型返回不同的值。只要你的散列映射实现有合理的冲突处理,这对你来说就足够了。
如cppreference:所述
返回实现定义的以null结尾的字符串包含类型的名称。在特别是,对于几种类型和同一程序调用之间的更改。
所以,不,你不能。实际上,你不能想当然。
尽管hash_code()
给了你:
size_t hash_code() const noexcept;
7返回:一个未指定的值,除了在一次执行中对于程序的任何两个type_info,它都应返回相同的值比较相等的对象。
8备注:一个实现应该为两个返回不同的值type_info对象的比较不相等。
这意味着只有当type_info
的operator==
支持时,hash_code()
才能用于区分两种不同的类型。
您可以做的是获取成员的地址。
class HashBase {
virtual intptr_t get() = 0;
};
template <typename T>
class Hash : HashBase {
static const int _addr = 0;
intptr_t get() override { return reinterpret_cast<intptr_t>(&_addr); }
};
- C++typeid模板值转换为联合不可接受的转换
- 使用typeid警告未使用的变量
- 如何在 lambda 中访问捕获的此指针的"typeid"?
- Visual Studio 2017 C++,不能使用 typeid() 获取信息对象,缺少指针?;
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- typeid 给出类型 m、j 和 Pj
- 在C++17中有typeid的反函数吗
- 如何实现构造函数,使其仅接受使用 typeid 的输入迭代器?
- typeid.name 返回派生类类型之前的数字
- 比较函数模板中的 VARTYPE 和 typeid().name / typename
- 返回别名标识符,而不是typeid(SOME_TYPE).name()中的类型
- typeid( " " ) != typeid(const char*)
- 将typeID转换为静态成员访问(C )的命名空间
- typeid 运算符忽略 cv 限定符背后的理由是什么?
- 为什么typeID().名称(),c 在输出中未显示const
- 当我将对象添加到向量时,为什么typeID名称会更改
- 汇编TypeID(OBJ)时会发生什么-C
- typeID检查有效后,使用reinterpret_cast
- 了解C 中的地图和向量的TypeId.name()输出
- C++11 - typeid uniqueness