2015-07-03 11 views
5

एक अभ्यास के रूप में मैं यह देखने की कोशिश कर रहा था कि मैं std::pair और std::tuple के लिए विशेषज्ञता बनाने के लिए SFINAE का उपयोग कर सकता हूं, जब उसके सभी टेम्पलेट पैरामीटर एक हस्ताक्षरित प्रकार के हैं। मेरे पास उनके साथ थोड़ा सा अनुभव है, लेकिन मुझे समझने के लिए हैश फ़ंक्शन को समझने के लिए पहले से ही typename Enabled = void के साथ टेम्पल किया गया है। मुझे सच में यकीन नहीं है कि यहां से कहाँ जाना है। यहां एक ऐसा प्रयास है जो काम नहीं करता है।std :: sfinae का उपयोग कर हैश विशेषज्ञता?

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

यह मेरी अपेक्षा है क्योंकि मैं टेम्प्लेट पैरामीटर का विस्तार करने के हैश करने के लिए कोशिश कर रहा हूँ ... लेकिन मैं तकनीक तो इन मामलों को संभालने के लिए यकीन नहीं है के बारे में है। क्या कोई मुझे समझने में मदद कर सकता है?

उत्तर

9

आपको उन प्रकारों के लिए std::hash विशेषज्ञ नहीं होना चाहिए जो आपके द्वारा परिभाषित प्रकार पर निर्भर नहीं हैं।

कहा कि, इस हैक काम कर सकते हैं:

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; 
    } 
}; 

सच है, हालांकि, यह मत करो। अपना खुद का हैशर लिखें।

+0

जोड़े/टुपल्स के लिए 'std :: हैश' का विशेषज्ञ नहीं होने का एक अच्छा कारण है: मुझे उम्मीद है कि कुछ समय पर ऑटो-संयोजन हैश 'std' में दिखाई देगा। – Yakk

संबंधित मुद्दे