C++11 - typeid uniqueness

C++11 - typeid uniqueness

本文关键字:uniqueness typeid C++11      更新时间:2023-10-16

在C++11中,我使用这个

typeid(T).name()

用于我自己的哈希计算。我不需要程序运行或编译之间的结果相同。我只需要它是独一无二的类型。我知道,它可以为不同的类型返回相同的名称,但通常带有常量、指针等。在我的情况下,T只是class XYstruct 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_infooperator==支持时,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); }
};