为满足条件的类专门化 `std::hash`

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 专门化为派生类

一个解决方案,或者一个明确的“否”,然后是一个简短的解释,都是一个很好的答案。

Jar*_*d42 5

不确定它是否合法,但是使用 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)

演示

  • 不确定通过概念专门化 std 是否合法。 (3认同)