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?