gpt4 book ai didi

c++ - 为 vector : template parameters not deducible in partial specialization 定义散列

转载 作者:搜寻专家 更新时间:2023-10-30 23:54:54 24 4
gpt4 key购买 nike

我正在尝试为 vector 定义一个散列器。我有一个用于简单类型的主要模板,以及一个用于具有 operator() 的类的特化。但是,我收到错误 template parameters not deducible in partial specialization。有人可以指出原因吗?

 template <typename T> struct hash<vector<T>>
{
size_t operator()(const vector<T> &x) const
{
size_t res = 0;

for(const auto &v:x) {
boost::hash_combine(res,v);
}

return res;
}
};

template <typename T> struct hash<vector<enable_if_t<true_t<decltype(sizeof(declval<T>()()))>::value, T>>>
{
size_t operator()(const vector<T> &x) const
{
size_t res = 0;

for(const auto &v:x) {
boost::hash_combine(res,v());
}

return res;
}
};

最佳答案

我真的不喜欢这里的部分特化,尤其是因为它会导致代码重复。

template <typename T> 
struct hash<vector<T>>
{
template<class T>
static auto call_if_possible(const T& t, int) -> decltype(t()) { return t(); }
template<class T>
static auto call_if_possible(const T& t, ...) -> decltype(t) { return t; }

size_t operator()(const vector<T> &x) const
{
size_t res = 0;
for(const auto &v:x) {
boost::hash_combine(res,call_if_possible(v, 0));
}
return res;
}
};

(如果这个 hash 实际上是 std::hash,那么答案是“不要这样做”。除非特化取决于用户定义的类型。)

关于c++ - 为 vector : template parameters not deducible in partial specialization 定义散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34666925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com