मैं मानक लाइब्रेरी के अनियंत्रित कंटेनरों के डिफ़ॉल्ट तत्कालताओं का उपयोग करके किसी विशेष प्रकार को हैशबल करने के लिए एक प्रकार का गुण बनाना चाहता हूं, इस प्रकार यदि std::hash
के लिए इसका वैध विशेषज्ञता है। मुझे लगता है कि यह एक बहुत उपयोगी सुविधा होगी (उदाहरण के लिए std::set
का उपयोग सामान्य कोड में std::unordered_set
के लिए असफलता के रूप में करने के लिए)। इसलिए मैं, यह सोच कर std::hash
प्रत्येक प्रकार के लिए परिभाषित नहीं है, निम्नलिखित SFINAE समाधान करना शुरू कर दिया: (। मेरी मामूली SFINAE-क्षमताओं माफ कर दो अगर यह सबसे अच्छा समाधान या भी गलत नहीं है)जांचें कि क्या हैशबल
template<typename T> std::true_type hashable_helper(
const T&, const typename std::hash<T>::argument_type* = nullptr);
template<typename T> std::false_type hashable_helper(...);
//It won't let me derive from decltype directly, why?
template<typename T> struct is_hashable
: std::is_same<decltype(hashable_helper<T>(std::declval<T>())),
std::true_type> {};
लेकिन तब मैंने सीखा, कि जीसीसी 4.7 और वीसी ++ 2012 किसी भी प्रकार T
के लिए परिभाषित करें, गैर-विशिष्ट संस्करण में केवल static_assert
आईएनजी। लेकिन सशर्त रूप से संकलित करने के बजाय वे (और क्लैंग 3.1जीसीसी 4.7 के libstdC++) का दावा विफलता के परिणामस्वरूप एक संकलन त्रुटि में विफल रहता है। ऐसा लगता है क्योंकि मुझे लगता है कि static_assert
एस को SFINAE (दाएं?) द्वारा नियंत्रित नहीं किया जाता है, इसलिए एक SFINAE समाधान संभवतः बिल्कुल नहीं लगता है। gcc 4.6
के लिए यह और भी बदतर है, जिसमें सामान्य std::hash
टेम्पलेट में भी नहीं है लेकिन को ()
ऑपरेटर को परिभाषित नहीं करता है, जिसके परिणामस्वरूप इसका उपयोग करने का प्रयास करते समय एक लिंकर त्रुटि होती है (जो संकलन त्रुटि से हमेशा खराब होती है और मैं एक लिंकर त्रुटि को एक कंपाइलर त्रुटि में बदलने के लिए किसी भी तरह की कल्पना नहीं कर सकता)।
तो वहाँ किसी भी मानक-conformant और पोर्टेबल तरह से लौटने अगर एक प्रकार एक वैध std::hash
विशेषज्ञता, या हो सकता है है इस तरह के एक प्रकार विशेषता परिभाषित करने के लिए कम से कम पुस्तकालयों static_assert
सामान्य टेम्पलेट में ing (किसी भी तरह में static_assert
त्रुटि बदलने के लिए एक SFINAE गैर त्रुटि)?
संपादित करें: ठीक है, के बारे में मेरे बयान * कुलपति ++ * संकलन यह कुछ अलग पुराने संस्करण से वास्तव में, * कुलपति ++ * बर्ताव करता है जैसे * जीसीसी *, पर घुट 'static_assert' –
लगता है कि जीसीसी लोग जानते हैं इस बीच समस्या का। ऐसा कहा जाता है कि जीसीसी 4.8 में अब यह स्थिर जोर नहीं है, लेकिन वे भविष्य में मानक कार्यान्वयन करने पर विचार करते हैं, कुछ हद तक बूस्ट हैश के समान है, जहां कार्यान्वयन एडीएल द्वारा उठाया जाता है। – Ichthyo
https://gcc.gnu.org/ml/libstdc++/2013-03/msg00029.html – Ichthyo