C ++ 11 - typeid唯一性

时间:2016-11-01 10:10:19

标签: c++ c++11 typeid

在C ++ 11中,我使用的是

typeid(T).name()

我自己的哈希计算。我不需要在程序运行或编译之间使结果相同。我只需要它对于类型是唯一的。 我知道,它可以为不同的类型返回相同的名称,但它通常使用const,指针等。 就我而言,T仅为class XYstruct XX或派生类型。

在这种情况下,我可以假设T是唯一的吗?

4 个答案:

答案 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); }
};