Std :: is_function कैसे लागू किया जाता है?


82

निम्नलिखित एक कार्यान्वयन कैसे है std::is_function?

template<class T>
struct is_function : std::integral_constant<
    bool,
    !std::is_const<const T>::value && !std::is_reference<T>::value
> {};

( सीपीपी संदर्भ से )

मुझे लगता है, intइस परिभाषा के तहत एक समारोह होगा। मैं क्या खो रहा हूँ?


10
!is_constभाग के बारे में सोचो ।
22

फ़ंक्शन प्रकार कॉन्स्टेबल क्यों नहीं हो सकते? क्या यह घृणित प्रकारों से संबंधित है?
jtbandes

4
@jtbandes ऐसा इसलिए है क्योंकि फ़ंक्शन C ++ में कुछ चीजों में से एक हैं जो ऑब्जेक्ट नहीं हैं।
अयक्सन २

1
मुझे लगता है कि एक अर्थ में यह हमेशा
कास्ट है

मुझे लगता है जैसे शीर्षक भ्रामक है। "यह एक मान्य std :: is_function कार्यान्वयन कैसे है?" अधिक उचित लगता है।
वैल का कहना है कि मोनिका

जवाबों:


73

आइए स्थितियों के अनुसार चलते हैं:
यदि आप const Tकॉन्स्टेबल नहीं हैं ( constवास्तव में फ़ंक्शन प्रकार के लिए लागू नहीं होते हैं क्योंकि फ़ंक्शन ऑब्जेक्ट नहीं हैं), और Tएक संदर्भ नहीं है ( constया तो उसी कारण से संदर्भ पर लागू नहीं होता है) , यह एक फ़ंक्शन प्रकार है। int(या किसी अन्य गैर समारोह गैर-संदर्भ प्रकार) में क्योंकि फिट नहीं होता is_const<const int>::valueहै true

C ++ 17 मानक के अनुसार .311.3.5 कार्य / अनुभाग 7 : (जोर मेरा)

फ़ंक्शन डिक्लेरेटर में cv-qualifier-seq का प्रभाव फ़ंक्शन प्रकार के शीर्ष पर cv- योग्यता को जोड़ने के समान नहीं है। बाद के मामले में, सीवी-क्वालीफायर को नजरअंदाज कर दिया जाता है। [नोट: एक फ़ंक्शन प्रकार जिसमें cv-qualifier-seq होता है, वह cv- योग्य प्रकार नहीं होता है; कोई cv- योग्य फ़ंक्शन प्रकार नहीं हैं। - अंतिम नोट] [...]


5
आह .... मुझे इस के is_const भाग के अंदर "const" याद आ रहा था। यह समझ आता है।
रियान क्विन

54

भाषा में केवल दो प्रकार की श्रेणियां हैं जिनके पास कांस्टेबिलिटी नहीं है: संदर्भ प्रकार, और फ़ंक्शन प्रकार। इसलिए, यदि const Tएक कास्ट-योग्य प्रकार होने में विफल रहता है, तो इसका मतलब Tहै कि फ़ंक्शन प्रकार या संदर्भ प्रकार। यदि आप संदर्भ प्रकारों को नियंत्रित कर सकते हैं, तो आपको केवल फ़ंक्शन प्रकारों के साथ छोड़ दिया जाएगा।

ध्यान दें कि एक समारोह प्रकार जैसे एक सीवी-क्वालीफायर वहन करती है, int(int) constयह है, नहीं एक स्थिरांक योग्य प्रकार। यह एक "घृणित कार्य प्रकार" का एक उदाहरण है, जिसका एकमात्र वास्तविक उपयोग सूचक-से-सदस्य-प्रकार के फ़ंक्शन की रचना या विघटित करना है। int(int) constशीर्ष पर कांस्टेबिलिटी को जोड़कर प्रकार प्राप्त नहीं किया जा सकता है int(int)। बल्कि, constनिहित ऑब्जेक्ट पैरामीटर पर लागू होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.