派生类的哈希

时间:2018-11-30 00:10:05

标签: c++ templates subclassing

我遇到的情况是,我派生一个类而不更改其任何数据,因此保留其父级的哈希函数就可以了。但是,这并非开箱即用:

#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>的简单方法?

1 个答案:

答案 0 :(得分:1)

那呢:

.

或者您也可以直接将_传递给设置为的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>