使嵌套类型哈希能够用于std::unordered_set
Make nested type hash-able for std::unordered_set
我有一个模板structs。结构体foo具有嵌套类型。
template<typename Data>
struct Bar{
};
template<typename Data>
struct Foo {
typedef typename std::pair<Bar<Data>*,Foo<Data>*> Pointers;
std::unordered_set<Pointers> pointers;
};
我想让指针可以散列,适合std::unordered_set<Pointers>
我在这里读到:
如何在无序容器中为用户定义的类型专门化std::hash::operator()?
如何正确散列自定义结构?
boost::hash_combine
模板和嵌套类/结构
并将所有知识结合到这个代码中:
namespace std {
template <typename Dara> struct hash< typename Foo<Data>::Pointers>
{
size_t operator()(const typename Foo<Data>::Pointers & x) const
{
std::size_t seed = 0;
boost::hash_combine(seed, x.first);
boost::hash_combine(seed, x.second);
return seed;
}
};
}
在最后一段代码中,编译器抛出一个错误:错误:部分专用化中未使用模板参数:Data
在这里指向:typename数据。
我尝试从模板中删除数据,并像这样使用它:template <> struct hash< typename Foo::Pointers>
但编译器告诉我,它的模板类型错误。
如何更正我的代码?
谨致问候,塔尔。
您不能专门化嵌套类型。编译器无法推断出您要专门化的内容。您可以直接将std::hash<...>
专门化为适当的类型,不过:
namespace std {
template <typename Data>
struct hash<std::pair<Bar<Data>*,Foo<Data>*>> {
...
}
}
请注意,指针通常不是好的键。您可能需要将*x.first
和*x.second
与hash_combine()
一起使用。
我发现了更简单的解决方案:添加boost::hash:
使Foo结构像这样:
template<typename Data>
struct Foo {
typedef typename std::pair<Bar<Data>*,Foo<Data>*> Pointers;
std::unordered_set<Pointers,boost::hash<Pointers> pointers;
};
从这里阅读:
相关文章:
- 为什么我无法更改"set<set>"循环中的值<int>
- 对于set上的循环-获取next元素迭代器
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 如何使用set实现无序数据结构?
- 使用运算符调用 void 函数时出错<set>
- 修改"std::set"中用户定义类型的值
- 生成提升::hana::set 的常量表达式问题
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- set::find 查找不存在的元素
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- google test PrintTo for std::set<std::string>