Nir*_*man 10 c++ templates c++11
假设我有一个简单的布尔特征类MyTrait. 也就是说,对于任何类型T,我都可以做MyTrait<T>::value并得到正确或错误的结果。我想专门std::hash为各类T地方MyTrait<T>::value是真实的。有没有办法做到这一点?一些失败的尝试:
template <class T, typename std::enable_if<
MyTrait<T>::value, int
>::type = 0>
struct hash<T> {
...
}
Run Code Online (Sandbox Code Playgroud)
失败,因为:
error: default template argument in a class template partial specialization
Run Code Online (Sandbox Code Playgroud)
我还尝试将所有部分专业化的东西放在哈希之后,但随后会出现一条错误消息,说明T处于非推导的上下文中。
有没有办法做到这一点?至少有一个关于 SO 的先前问题表明没有:将std::hash 专门化为派生类。
一个解决方案,或者一个明确的“否”,然后是一个简短的解释,都是一个很好的答案。
不确定它是否合法,但是使用 C++20 的概念,您可能会执行以下操作:
template <typename T>
concept MyConcept = MyTrait<T>::value;
namespace std
{
template <MyConcept T>
struct hash<T>
{
std::size_t operator()(const T& t) const { /*..*/ }
// ...
};
}
Run Code Online (Sandbox Code Playgroud)