специализация 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>>
Речь идет о том, что я ожидал, потому что я пытаюсь расширить параметры шаблона до хэша ... Но я не уверен, что техника для обработки этих случаев тогда. Может кто-нибудь помочь мне понять?