C++ 11是否为std :: type_info提供散列函数?

Bil*_*eal 8 c++ unordered-map rtti typeinfo c++11

我仍在努力为我的One-A型容器问题提供一个很好的解决方案- 经过反思,我认为能够使用类似的东西会很好std::map<std::type_info, boost::any>.不幸的是,std::type_info没有定义一个operator<,我认为它定义一个是不合理的.

但是,为它定义哈希函数似乎是合理的,因为您可以简单地将std::type_info对象的单个地址用作合理的"哈希".因此,您可以将std::type_infoa std::unordered_map作为键.

C++ 11是否提供了这样的哈希函数?使用std::type_info单例的内存地址会是一个错误的哈希策略吗?

Fer*_*lli 12

你也可以使用type_index,它可以安全地保存一个指向type_info的指针,它是可复制的,具有可比性,并且为标准容器提供了一个哈希函数.


Jam*_*lis 9

type_info不低于可比性的事实并不是将其用作映射键的问题,因为它type_info是不可复制的事实.:-)

在C++ 03中,type_info有一个before()提供type_info对象排序的成员函数.

在C++ 11中,type_info有一个hash_code()成员函数(C++11§18.7.1/ 7):

size_t hash_code() const throw();
Run Code Online (Sandbox Code Playgroud)

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

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

type_infotypeid操作符产生的对象一直存在到程序结束,因此使用a type_info*作为映射键是安全的.但是,据我所知,无法保证如果您应用typeid两个相同类型的对象,您将获得对同一type_info对象的两个引用.

如果你type_info*用作映射键,我会使用一个自定义比较器来取消引用指针并比较type_info对象本身(使用上述before()hash_code()订购).

  • @Billy:但是,你可以写一个`bool compare(const type_info*x,const type_info*y){return x-> before(*y); 使用`operator <`来比较`hash_code()`返回的哈希码. (2认同)
  • 哈希函数不是*required*来返回唯一值,因为它是一个哈希函数.散列容器必须处理散列冲突.理想情况下,编译器会为typeinfo对象生成一个完美的哈希函数,因为它们在编译时都是已知的.标准并不要求它,可能是因为它可能是非平凡的. (2认同)