std :: especialización hash usando sfinae?

Como ejercicio, intentaba ver si podía usar SFINAE para crear unstd::hash especialización parastd::pair ystd::tuple cuando todos sus parámetros de plantilla son de un tipo sin signo. Tengo un poco de experiencia con ellos, pero por lo que entiendo, la función hash debe haber sido creada con untypename Enabled = void para que yo agregue una especialización. No estoy realmente seguro de a dónde ir desde aquí. Aquí hay un intento que no 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;
}

Error:

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>>

Se trata de lo que esperaba porque estoy tratando de extender los parámetros de la plantilla a hash ... Pero no estoy seguro de la técnica para manejar estos casos entonces. ¿Puede alguien ayudarme a entender?

Respuestas a la pregunta(1)

Su respuesta a la pregunta