派生的散列 class
hash for derived class
我有一个案例,我在不更改任何数据的情况下导出 class,因此保留其父级的哈希函数就可以了。然而,这并不是开箱即用的:
#include <unordered_set>
struct A { size_t value; };
struct B : public A {};
namespace std
{
template<>
struct hash<A>
{
typedef A argument_type;
typedef size_t result_type;
result_type operator()(argument_type const& a) const noexcept { return a.value; }
};
}
int main()
{
std::unordered_set<A> a_set; // works fine
std::unordered_set<B> b_set; // error: hash<B> not found
}
有没有一种简单的方法可以在不显式实现的情况下完成这项工作hash<B>
?
这个怎么样:
template <class T,
typename std::enable_if<std::is_base_of<A, T>::value, bool>::type = true // just for the hard error
> using hash = std::hash<A>;
std::unordered_set<A> a_set;
std::unordered_set<B, hash<B>> b_set;
或者您可以将 std::hash<A>
直接传递给 B
设置为:
std::unordered_set<B, hash<A>> b_set;
我有一个案例,我在不更改任何数据的情况下导出 class,因此保留其父级的哈希函数就可以了。然而,这并不是开箱即用的:
#include <unordered_set>
struct A { size_t value; };
struct B : public A {};
namespace std
{
template<>
struct hash<A>
{
typedef A argument_type;
typedef size_t result_type;
result_type operator()(argument_type const& a) const noexcept { return a.value; }
};
}
int main()
{
std::unordered_set<A> a_set; // works fine
std::unordered_set<B> b_set; // error: hash<B> not found
}
有没有一种简单的方法可以在不显式实现的情况下完成这项工作hash<B>
?
这个怎么样:
template <class T,
typename std::enable_if<std::is_base_of<A, T>::value, bool>::type = true // just for the hard error
> using hash = std::hash<A>;
std::unordered_set<A> a_set;
std::unordered_set<B, hash<B>> b_set;
或者您可以将 std::hash<A>
直接传递给 B
设置为:
std::unordered_set<B, hash<A>> b_set;