मैं अपने ऑब्जेक्ट के लिए हैश फ़ंक्शन लिख रहा हूं। मैं पहले से ही हैश कंटेनर कर सकता हूं, और हैश को जोड़ सकता हूं, Generic Hash function for all STL-containers के लिए धन्यवाद। लेकिन मेरे वर्गों में भी enums है। बेशक मैं हर enum के लिए एक हैश समारोह बना सकते हैं, लेकिन यह एक अच्छा विचार प्रतीत नहीं होता है। क्या std::hash
के लिए कुछ सामान्य विनिर्देश बनाना संभव है, ताकि यह हर enum पर लागू किया जा सके? ऐसा ही कुछ, का उपयोग कर std::enable_if
और std::is_enum
सी ++ 11 हैश फ़ंक्शन किसी भी एनम प्रकार
namespace std {
template <class E>
class hash<typename std::enable_if<std::is_enum<E>::value, E>::type> {
public:
size_t operator()(const E& e) const {
return std::hash<std::underlying_type<E>::type>()(e);
}
};
};
पी एस। इस कोड को संकलित नहीं है
error: template parameters not used in partial specialization:
error: ‘E’
यह 'टेम्पलेट कक्षा हैश 'प्राथमिक टेम्पलेट' हैश' को परिभाषित करता है, विशेषज्ञता नहीं। एक विशेषज्ञता इस तरह दिखेगी: 'टेम्पलेट कक्षा हैश >'। मुझे सच में नहीं लगता कि आप प्राथमिक टेम्पलेट 'std :: हैश ' को फिर से परिभाषित कर सकते हैं। –
cdyson37
@ cdyson37 इसके अलावा, जो भी आप उल्लेख करते हैं वह _partial विशेषज्ञताकरण पूर्ण प्रतीत होता है 'टेम्पलेट <> स्ट्रक्चर हैश {...}; '** इसके अलावा **, आंशिक विशेषज्ञता मानक के खिलाफ है और इसे निर्दिष्ट किया गया है ** अपरिभाषित व्यवहार **। इसे देखें [SO प्रश्न/उत्तर] (http://stackoverflow.com/questions/28077592/extending-namespace-std-via-partial-template- विशेषज्ञता)। –
यह वास्तव में आंशिक विशेषज्ञता है। लेकिन मेरा मानना है कि इसकी अनुमति है - देखें [यहां] (http://stackoverflow.com/questions/23339298/stdhash-template-partial-specialization) – cdyson37