我仍在为我的一个很好的解决方案努力 一种类型的容器问题 - 经过反思,我认为只能使用像 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_infotypeid 运算符一直存在直到程序结束,因此可以安全地使用 type_info* 作为地图键。但是,据我所知,不能保证如果您申请 typeid 对于同一类型的两个对象,您将获得两个引用相同的引用 type_info 目的。

如果您确实使用 type_info* 作为地图键,我将使用一个自定义比较器,该比较器将指示指针并进行比较 type_info 物体本身(使用上述 before() 或者 hash_code() 用于订购)。

其他提示

你也可以使用 type_index, ,它可以安全地将指针指向type_info,可复制,可比且为标准容器提供哈希功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top