मैं टेम्पलेट पैरामीटर में एक सदस्य समारोह baz()
की उपस्थिति का पता लगाने की कोशिश कर रहा था:क्यों decltype (घोषणा <T>() .func()) काम करता है जहां decltype (& T :: func) नहीं है?
template<typename T, typename = void>
struct ImplementsBaz : public std::false_type { };
template<typename T>
struct ImplementsBaz<T, decltype(&T::baz)> : public std::true_type { };
लेकिन यह हमेशा झूठे पैदा करता है:
struct Foo {};
struct Bar { void baz() {} };
std::cout << ImplementsBaz<Foo>::value << std::endl; // 0
std::cout << ImplementsBaz<Bar>::value << std::endl; // also 0
declval
और का उपयोग करना विधि काम करता है बुला, हालांकि:
template<typename T>
struct ImplementsBaz<T, decltype(std::declval<T>().baz())> : public std::true_type { };
बेशक, अब यह ऑनल हो सकता है y 0 तर्कों के साथ baz
फ़ंक्शन का पता लगाएं। declval<T>().baz()
का उपयोग करते समय विशेषज्ञता का सही ढंग से चयन क्यों किया जाता है, लेकिन decltype(&T::baz)
नहीं?
बस एक अनुमान: यदि आप सामान्य टेम्पलेट में डिफ़ॉल्ट '' = void'' को हटाते हैं तो क्या होता है? – bjhend
फिर 'कार्यान्वयन Baz :: मूल्य' अवैध है:' बहुत कम टेम्पलेट तर्क ' –
jtbandes
आह, हाँ, मैंने इसे अनदेखा कर दिया। – bjhend