Bir alıştırma olarak, tüm şablon parametreleri işaretsiz bir türdeyken, 10 ve std::tuple
için std::hash
uzmanlık oluşturmak için SFINAE kullanıp kullanamayacağımı görmeye çalışıyordum. Onlarla biraz deneyimim var, ama anladığım kadarıyla, bir özelleştirme eklemek için karma işlevinin bir typename Enabled = void
ile tempold edilmiş olması gerekiyor. Buradan nereye gideceğime emin değilim. İşte çalışmayan bir girişim.std :: sfinae kullanarak hash uzmanlığı?
#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;
}
Hata:
O ben karma şablon parametrelerini genişletmeye çalışıyorum ... Ama teknik daha sonra bu davayı ele almaya emin değilim çünkü beklediğim ilgilihash_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>>
. Birisi anlayamama yardım edebilir mi?
Çiftler için "std :: hash" konusunda uzman olmamanın iyi bir nedeni var: Gerçekten de otomatik birleştirme karmaşasının kısa bir süre 'std'de görünmesini beklerdim. – Yakk