我已经尝试实现一种适用于任何迭代器类型的std::hash
函数,其中用户必须为其类型T
实现哈希函数。
我对std::hash
的{{1}}函数的最初实现如下所示:
std::array
为支持任何迭代器,我一直在尝试使用sfinae,可以在下面看到我当前对容器类型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;
}
};
的实现:
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;
的必需参数。