作为一项练习,我试图使用SFINAE(Substitution Failure Is Not An Error)来创建一个std::pair和std::tuple的std::hash特化版本,当它们所有的模板参数都是无符号类型时。虽然我对它们有一点经验,但据我所知,哈希函数需要已经使用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>>
我的预期是扩展模板参数到哈希,所以这个情况很正常。但我不确定如何处理这些情况的技术方法。有人可以帮我理解吗?
std::hash
:我真的希望自动组合哈希很快会出现在std
中。 - Yakk - Adam Nevraumontfirst
?也就是说,为什么不使用std::enable_if_t<std::is_unsigned<T>::value, T>
?enable_if
不是应该做first
在这里的工作吗? - ofo