C ++ 11是否为STD :: Type_info提供哈希功能?
-
30-09-2019 - |
题
我仍在为我的一个很好的解决方案努力 一种类型的容器问题 - 经过反思,我认为只能使用像 std::map<std::type_info, boost::any>
. 。很遗憾, std::type_info
不定义 operator<
, ,我认为定义一个是不合理的。
但是,为其定义哈希函数似乎确实是合理的,因为您可以简单地使用该函数 std::type_info
对象是合理的“哈希”。因此,您将能够放一个 std::type_info
进入 std::unordered_map
作为钥匙。
C ++ 11是否提供这样的哈希功能?会使用的内存地址 std::type_info
Singleton是一个不好的哈希策略?
解决方案
事实 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
运算符一直存在直到程序结束,因此可以安全地使用 type_info*
作为地图键。但是,据我所知,不能保证如果您申请 typeid
对于同一类型的两个对象,您将获得两个引用相同的引用 type_info
目的。
如果您确实使用 type_info*
作为地图键,我将使用一个自定义比较器,该比较器将指示指针并进行比较 type_info
物体本身(使用上述 before()
或者 hash_code()
用于订购)。
其他提示
你也可以使用 type_index, ,它可以安全地将指针指向type_info,可复制,可比且为标准容器提供哈希功能。