दिलचस्प पोस्ट
नियमित समय अंतराल पर जावास्क्रिप्ट फ़ंक्शन चलाएं किसी फ़ाइल से # से शुरू होने वाली सभी लाइनों को हटाएं कोणीय जेएस का उपयोग करके एक ड्रॉपडाउन सूची नियंत्रण का एक चयनित विकल्प कैसे सेट करें एंड्रॉइड ओपन पीडीएफ फाइल सी + + प्रीप्रोसेसर # एक कीवर्ड को परिभाषित करना। क्या यह मानक मानता है? मैं कमांड लाइन से एक युद्ध में एक क्लास कैसे चलाऊँ? नियंत्रक में रेक कार्य को चलाएं बचत से पहले WPF डाटाबेस जावा में अलग रिटर्न प्रकार के साथ अधिभार? ऐरे एलीमेंट और फिर री इंडेक्स एरे को कैसे निकालें? क्या मैं एचटीएमएल 5 वीडियो टैग का उपयोग कर एक वीडियो के साथ पारदर्शी पृष्ठभूमि कर सकता हूं? एंड्रॉइड में सीरियलजएबल का प्रयोग खराब है? पायथन सूची निर्देशिका, उपनिर्देशिका, और फ़ाइलें जब मेरे पास सूचीबॉक्सेज़ में मेरे पास छवियाँ हैं, तो मुझे आउटऑफ़मॉमी अपवाद क्यों मिलता है? संख्या के हेक्स स्ट्रिंग के रूप में स्विफ्ट मूल कार्य

एक सदस्य की जांच करना संभवतः आधार वर्ग, सी ++ 11 संस्करण में मौजूद है

Https://stackoverflow.com/a/1967183/134841 में , एक समाधान स्थिर रूप से जांचने के लिए प्रदान किया जाता है कि कोई सदस्य मौजूद है या नहीं, संभवतः एक प्रकार के उप-वर्ग में:

template <typename Type> class has_resize_method { class yes { char m;}; class no { yes m[2];}; struct BaseMixin { void resize(int){} }; struct Base : public Type, public BaseMixin {}; template <typename T, T t> class Helper{}; template <typename U> static no deduce(U*, Helper<void (BaseMixin::*)(), &U::foo>* = 0); static yes deduce(...); public: static const bool result = sizeof(yes) == sizeof(deduce((Base*)(0))); }; 

हालांकि, यह सी ++ 11 final कक्षाओं पर काम नहीं करता है, क्योंकि यह परीक्षण के अधीन वर्ग से मिलता है, जो final रोकता है।

ओटोह, यह एक:

 template <typename C> struct has_reserve_method { private: struct No {}; struct Yes { No no[2]; }; template <typename T, typename I, void(T::*)(I) > struct sfinae {}; template <typename T> static No check( ... ); template <typename T> static Yes check( sfinae<T,int, &T::reserve> * ); template <typename T> static Yes check( sfinae<T,size_t,&T::reserve> * ); public: static const bool value = sizeof( check<C>(0) ) == sizeof( Yes ) ; }; 

बेस क्लासेस में reserve(int/size_t) विधि खोजने में विफल रहता है

क्या इस मेटाफ़ाँन का एक कार्यान्वयन है जो दोनों T बेस स्क्वासेस में reserved() पाता है और अभी भी काम करता है यदि T final ?

Solutions Collecting From Web of "एक सदस्य की जांच करना संभवतः आधार वर्ग, सी ++ 11 संस्करण में मौजूद है"

असल में, सी ++ 11 में decltype और देर से रिटर्न बाइंडिंग मशीनरी के लिए बहुत कुछ आसान हो गया।

अब, यह परीक्षण करने के लिए तरीकों का उपयोग करना आसान है:

 // Culled by SFINAE if reserve does not exist or is not accessible template <typename T> constexpr auto has_reserve_method(T& t) -> decltype(t.reserve(0), bool()) { return true; } // Used as fallback when SFINAE culls the template method constexpr bool has_reserve_method(...) { return false; } 

आप उदाहरण के लिए एक क्लास में इसका उपयोग कर सकते हैं:

 template <typename T, bool b> struct Reserver { static void apply(T& t, size_t n) { t.reserve(n); } }; template <typename T> struct Reserver <T, false> { static void apply(T& t, size_t n) {} }; 

और आप इसका उपयोग करते हैं:

 template <typename T> bool reserve(T& t, size_t n) { Reserver<T, has_reserve_method(t)>::apply(t, n); return has_reserve_method(t); } 

या आप एक enable_if विधि चुन सकते हैं:

 template <typename T> auto reserve(T& t, size_t n) -> typename std::enable_if<has_reserve_method(t), bool>::type { t.reserve(n); return true; } template <typename T> auto reserve(T& t, size_t n) -> typename std::enable_if<not has_reserve_method(t), bool>::type { return false; } 

ध्यान दें कि यह स्विचिंग चीजें वास्तव में इतनी आसान नहीं हैं सामान्य तौर पर, जब enable_if मौजूद है तो यह बहुत आसान है – और आप केवल एक ही विधि enable_if होना चाहते हैं और कोई भी फॉलबैक प्रदान नहीं करना चाहते हैं:

 template <typename T> auto reserve(T& t, size_t n) -> decltype(t.reserve(n), void()) { t.reserve(n); } 

यदि प्रतिस्थापन विफल हो जाता है, तो यह विधि संभावित अधिभार की सूची से हटा दी जाती है।

नोट: की शब्दावली के लिए धन्यवाद , (कॉमा ऑपरेटर) आप decltype में कई decltype चेन कर सकते हैं और केवल अंतिम वास्तव में प्रकार का फैसला करता है। कई कार्यों को देखने के लिए काम।

एक संस्करण जो कि decltype पर निर्भर करता है, परन्तु मनमाना प्रकार (...) [जो वास्तव में एक गैर-मुद्दा है, देखें, जोहान्स की टिप्पणी देखें] पर नहीं:

 template<typename> struct Void { typedef void type; }; template<typename T, typename Sfinae = void> struct has_reserve: std::false_type {}; template<typename T> struct has_reserve< T , typename Void< decltype( std::declval<T&>().reserve(0) ) >::type >: std::true_type {}; 

मैं इस विशेषता के अनुसार इंगित करना चाहूंगा जैसे कि std::vector<int>& समर्थन reserve : यहां अभिव्यक्ति का निरीक्षण किया जाता है, प्रकार नहीं सवाल यह है कि इस विशेषता का जवाब "इस प्रकार T लिए एक lval को देखते हुए, अभिव्यक्ति lval.reserve(0); है। lval.reserve(0); अच्छी तरह से बनाई गई" प्रश्न के समान नहीं "क्या इस प्रकार या उसके किसी भी आधार प्रकार में एक reserve सदस्य घोषित किया गया है"

दूसरी ओर, यकीनन यह एक विशेषता है! याद रखें कि नया C ++ 11 विशेषता शैली की है is_default_constructible , has_default_constructor नहीं है । भेद सूक्ष्म है, लेकिन इसमें गुण हैं। ( is_*ible की शैली में एक बेहतर फिटिंग नाम ढूँढना एक व्यायाम के रूप में छोड़ दिया गया है।)

किसी भी स्थिति में आप अभी भी एक विशेषता का उपयोग कर सकते हैं जैसे कि std::is_class को संभवतः जो आप चाहते हैं, प्राप्त कर सकते हैं।