2015-07-03 25 views
5

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

. Birisi anlayamama yardım edebilir mi?

cevap

9

Kendinizi tanımladığınız bir türe bağlı olmayan türler için std::hash uzmanlaşmanız gerekmez.

bu kesmek işe yarayabilecek, dedi ki:

template<class T, class E> 
using first = T; 

template <typename T> 
struct hash<first<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; 
    } 
}; 

Gerçekten olsa da, bunu yapma. Kendi makineni yaz.

+0

Ç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

İlgili konular