c++ - 构造接受任何可迭代类型的 std::hash 函数
问题描述
我试图实现一个std::hash
适用于任何迭代器类型的函数,用户必须为他们的 type 实现一个散列函数T
。std::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<>
.
解决方案
推荐阅读
- excel - VBA使用工作表中的usedrows用Null填充空白单元格
- angularjs - 控制器内部的 Webpack 生产环境不起作用?
- java - ORMLite QueryBuilder.orderByRaw(String, SelectArg) 忽略 QueryBuilder.queryRaw() 上的 SelectArg
- javascript - 按 MySQL SELECT COUNT(*) GROUP BY 显示条形图
- vue.js - vuetify 2.0 v-data-table 加载道具在加载后未禁用
- android - SoundPool play()... 在线程或主 UI 线程中更好?
- c# - c# return System.Byte[] ,我想用python打开
- angular - 在订阅中调用订阅的最佳方式是什么?
- tensorflow-serving - TensorFlow Serving 是否正式支持从 TF2.0 开始的所有模型
- node.js - 如何即时将视频 *.ts 转换为 *.mp4 并在网络上播放 (node.js)