एक अभ्यास के रूप में मैं यह देखने की कोशिश कर रहा था कि मैं 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>>
यह मेरी अपेक्षा है क्योंकि मैं टेम्प्लेट पैरामीटर का विस्तार करने के हैश करने के लिए कोशिश कर रहा हूँ ... लेकिन मैं तकनीक तो इन मामलों को संभालने के लिए यकीन नहीं है के बारे में है। क्या कोई मुझे समझने में मदद कर सकता है?
जोड़े/टुपल्स के लिए 'std :: हैश' का विशेषज्ञ नहीं होने का एक अच्छा कारण है: मुझे उम्मीद है कि कुछ समय पर ऑटो-संयोजन हैश 'std' में दिखाई देगा। – Yakk