在C ++ 11中,我使用的是
typeid(T).name()
我自己的哈希计算。我不需要在程序运行或编译之间使结果相同。我只需要它对于类型是唯一的。
我知道,它可以为不同的类型返回相同的名称,但它通常使用const,指针等。
就我而言,T
仅为class XY
,struct XX
或派生类型。
在这种情况下,我可以假设T
是唯一的吗?
答案 0 :(得分:26)
您应该使用std::type_index
进行映射。
type_index类是围绕std :: type_info的包装类 对象,可以在关联和无序中用作索引 关联容器。与type_info对象的关系是 通过指针维护,因此type_index是 CopyConstructible和CopyAssignable。
答案 1 :(得分:19)
std::type_info::name
是实现定义的,因此您不应该依赖于它对于不同类型的唯一性。
由于您正在为哈希计算执行此操作,因此应使用std::type_info::hash_code
代替。虽然这并不保证值是唯一的,但标准规定实现应尝试为不同类型返回不同的值。只要您的哈希映射实现具有合理的冲突处理,这对您来说就足够了。
答案 2 :(得分:5)
正如cppreference所述:
返回一个实现定义的以null结尾的字符串 包含类型的名称。不给予任何保证 特别是,返回的字符串对于几种类型可以是相同的 在同一程序的调用之间进行更改。
所以,不,你不能。你实际上不能做任何事情。
虽然hash_code()
给你:
size_t hash_code() const noexcept;
7返回:未指定的值,但在单次执行中除外 对于任何两个type_info,它应返回相同的值 比较相等的对象。
8备注:实现应返回两个不同的值 type_info对象,不比较等于。
这意味着hash_code()
仅在operator==
type_info
支持此项时才能用于区分两种不同的类型。
答案 3 :(得分:3)
您可以做的是获取会员的地址。
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); }
};