使 std::unordered_set 的嵌套类型可散列
Make nested type hash-able for std::unordered_set
我有一个模板结构。 struct 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>
我在这里阅读:
How to specialize std::hash::operator() for user-defined type in unordered containers?
How to properly hash the custom struct?
boost::hash_combine
Templates and nested classes/structures
并将所有知识结合到这段代码中:
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 Data.
我尝试从模板中删除数据并像这样使用它:
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;
};
阅读自here:
我有一个模板结构。 struct 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>
我在这里阅读:
How to specialize std::hash::operator() for user-defined type in unordered containers?
How to properly hash the custom struct?
boost::hash_combine
Templates and nested classes/structures
并将所有知识结合到这段代码中:
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 Data.
我尝试从模板中删除数据并像这样使用它:
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;
};
阅读自here: