首页 > 解决方案 > 构造接受任何可迭代类型的 std::hash 函数

问题描述

我试图实现一个std::hash适用于任何迭代器类型的函数,用户必须为他们的 type 实现一个散列函数Tstd::hash我对该函数的初始实现std::array如下所示:

template <typename T, size_t N>
struct std::hash<std::array<T, N>> {
    std::size_t operator()(const std::array<T, N>& x) const {
        auto hash_func = std::hash<T>{};
        size_t h_val{};
        for (T t : x) {
            h_val = h_val ^ hash_func(t);
        }
        return h_val;
    }
};

为了支持任何迭代器,我一直在尝试使用 sfinae,我当前的容器类型实现is_container如下所示:

template <typename T, typename = void> // primary declaration
struct is_container: std::false_type {}; // when all specializations fail

template <typename T>
struct is_container< // specialization
        T, // conditions:
        std::void_t<decltype(std::begin(std::declval<T&>()))>
>: std::true_type {};

template <typename C>  // *_v value
constexpr auto is_container_v = is_container<C>::value;

我的问题是我似乎无法匹配struct std::hash<>.

标签: c++templatesc++17sfinae

解决方案


推荐阅读