为什么 std::unordered_map<tuple<int, int>, string>
不能开箱即用?必须为 tuple<int, int>
定义一个哈希函数是很乏味的,例如
template<> struct do_hash<tuple<int, int>>
{ size_t operator()(std::tuple<int, int> const& tt) const {...} };
构建一个以元组为键的无序映射(Matthieu M.) 展示了如何为 boost::tuple
自动执行此操作。有没有在不使用可变参数模板的情况下为 c++0x 元组执行此操作?
当然这应该是标准:(
原文由 Leo Goodstadt 发布,翻译遵循 CC BY-SA 4.0 许可协议
这适用于 gcc 4.5,允许所有包含标准哈希类型的 c++0x 元组成为
unordered_map
和unordered_set
的成员,无需多言。 (我将代码放在头文件中并包含它。)该函数必须位于 std 命名空间中,以便它被参数相关名称查找 (ADL) 拾取。
有没有更简单的解决方案?
标准符合代码
Yakk 指出,在 std 命名空间中专门化事物实际上是未定义的行为。如果您希望有一个符合标准的解决方案,那么您需要将所有这些代码移动到您自己的命名空间中,并放弃 ADL 自动找到正确哈希实现的任何想法。代替 :
你需要:
其中
hash_tuple
是您自己的命名空间,而不是std::
。为此,您首先必须在
hash_tuple
命名空间中声明一个哈希实现。这会将所有非元组类型转发到std::hash
:确保
hash_combine
调用hash_tuple::hash
而不是std::hash
然后包含所有其他先前的代码,但将其放入
namespace hash_tuple
而不是std::