std :: Hash-Spezialisierung mit sfinae?

ls Übung habe ich versucht zu sehen, ob ich mit SFINAE ein @ erstellen kanstd::hash Spezialisierung fürstd::pair undstd::tuple, wenn alle Vorlagenparameter einen vorzeichenlosen Typ haben. Ich habe ein wenig Erfahrung mit ihnen, aber soweit ich weiß, muss die Hash-Funktion bereits mit einem @ -Zeichen versehen worden seitypename Enabled = void für mich eine Spezialisierung hinzuzufügen. Ich bin mir nicht sicher, wohin ich von hier aus gehen soll. Hier ist ein Versuch, der nicht funktioniert.

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

Es geht darum, was ich erwartet habe, weil ich versuche, die Template-Parameter auf Hash zu erweitern ... Aber ich bin mir nicht sicher, wie ich diese Fälle behandeln soll. Kann mir jemand helfen zu verstehen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage