C++ 11 - typeid唯一性

Mar*_*rry 27 c++ typeid c++11

在C++ 11中,我正在使用它

typeid(T).name()
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下,我可以假设,这T将是独一无二的吗?

Sto*_*ica 25

您应该std::type_index用于映射目的.

type_index类是围绕std :: type_info对象的包装类,可以在关联和无序关联容器中用作索引.与type_info对象的关系通过指针维护,因此type_index是CopyConstructible和CopyAssignable.

  • @MartinPerry,一个符合要求的实现可能只是转发到`std :: type_info`指针.但是,使用`type_index`来处理使`type_info`成为有效密钥所涉及的细节.*然后*,如果你发现默认的`std :: hash`专门化以次优的方式工作,你可以创建一个自定义的'Hasher`类型(或者从get go替换你当前的类型). (3认同)

Tar*_*ama 18

std::type_info::name 是实现定义的,因此您不应该依赖它对于不同类型是唯一的.

由于您正在为哈希计算执行此操作,因此您应该使用std::type_info::hash_code.虽然这并不能保证这些值是唯一的,但标准规定实现应尝试为不同类型返回不同的值.只要您的哈希映射实现具有合理的冲突处理,这对您来说就足够了.

  • 好吧,哈希不一定是完美的.你还是要比较平等,不管...... (7认同)
  • `std :: type_info :: hash_code`不保证在各种类型中都是唯一的! (5认同)
  • @TartanLlama也参见[这个SO问题](http://stackoverflow.com/questions/16253207/stdtype-in​​fohash-code-uniqueness-and-the-meaning-of-should)以及may/can/should的使用标准,[RFC 2119](https://www.ietf.org/rfc/rfc2119.txt):应该明确允许实现偏离(即使这不太可能) (4认同)

Som*_*ken 6

正如cppreference所述:

返回包含类型名称的实现定义的以null结尾的字符串.不给出任何保证,特别是返回的字符串对于几种类型可以是相同的,并且在相同程序的调用之间改变.

所以,不,你不能.你实际上不能做任何事情.

虽然,hash_code()给你:

size_t hash_code() const noexcept;

7返回:一个未指定的值,除了在程序的单次执行中,它应为任何两个比较相等的type_info对象返回相同的值.

8备注:实现应为两个不比较相等的type_info对象返回不同的值.

这意味着hash_code()可以用来区分两种不同类型的只有当operator==type_info支持此功能.