8

我仍在为我的One-Of-A-Type 容器问题寻找一个很好的解决方案——经过反思,我认为能够使用类似std::map<std::type_info, boost::any>. 不幸的是,std::type_info没有定义一个operator<,我认为定义一个是不合理的。

但是,为它定义一个散列函数似乎是合理的,因为您可以简单地将std::type_info对象的单例地址用作合理的“散列”。因此,您可以将 astd::type_info放入 astd::unordered_map作为键。

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

4

2 回答 2

13

您也可以使用type_index,它安全地保存指向 type_info 的指针,它是可复制的、可比较的,并且为标准容器提供了哈希函数。

于 2012-11-19T15:32:31.907 回答
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();

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

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

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

如果您确实type_info*用作映射键,我会使用自定义比较器来取消引用指针并比较type_info对象本身(使用上述before()hash_code()用于排序)。

于 2010-08-23T22:32:31.010 回答