специализация std :: hash с использованием sfinae?

В качестве упражнения я пытался понять, смогу ли я использовать SFINAE для созданияstd::hash специализация дляstd::pair а такжеstd::tuple когда все его параметры шаблона имеют тип без знака. У меня есть небольшой опыт работы с ними, но из того, что я понимаю, хеш-функция должна быть уже шаблонирована сtypename Enabled = void для меня, чтобы добавить специализацию. Я не совсем уверен, куда идти отсюда. Вот попытка, которая не работает.

#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;
}

Ошибка:

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

Речь идет о том, что я ожидал, потому что я пытаюсь расширить параметры шаблона до хэша ... Но я не уверен, что техника для обработки этих случаев тогда. Может кто-нибудь помочь мне понять?

Ответы на вопрос(1)

Ваш ответ на вопрос