especialização std :: hash usando sfinae?

Como exercício, estava tentando ver se poderia usar o SFINAE para criar umstd::hash especialização parastd::pair estd::tuple quando todos os seus parâmetros de modelo são de um tipo não assinado. Tenho um pouco de experiência com eles, mas, pelo que entendi, a função hash precisa já ter sido modelada com umtypename Enabled = void para eu adicionar uma especialização. Não tenho muita certeza para onde ir daqui. Aqui está uma tentativa que não funciona.

#include <functional>
#include <type_traits>
#include <unordered_set>
#include <utility>

namespace std {
template <typename T, typename Enabled = void>
struct hash<std::pair<T, T>, std::enable_if_t<std::is_unsigned<T>::value>>
{
    size_t operator()(const std::pair<T, T>& x) const
    {
        return x;
    }
};
}; // namespace std


int
main(int argc, char ** argv)
{
    std::unordered_set<std::pair<unsigned, unsigned>> test{};
    return 0;
}

Erro:

hash_sfinae.cpp:7:42: error: default template argument in a class template partial specialization
template <typename T, typename Enabled = void>
                              ^
hash_sfinae.cpp:8:8: error: too many template arguments for class template 'hash'
struct hash<std::pair<T, T>, std::enable_if_t<std::is_unsigned<T>::value>>

É sobre o que eu esperava, porque estou tentando estender os parâmetros do modelo para hash ... Mas não tenho certeza da técnica para lidar com esses casos. Alguém pode me ajudar a entender?

questionAnswers(1)

yourAnswerToTheQuestion