2010-07-07 13 views
21

मैं देख रहा था कि कैसे std::tr1::shared_ptr<> बूल डालने की क्षमता प्रदान करता है। मैंने पहले भी बाहर पकड़ा गया है कि जब एक स्मार्ट सूचक है कि तुच्छ समाधान के रूप में bool करने के लिए casted जा सकता है, यानीshare_ptr <> सुरक्षित रूप से बूल को कास्टिंग करने की अनुमति कैसे देता है?

operator bool() { 
    return m_Ptr!=0; 
} 

आमतौर पर परोक्ष सूचक प्रकार के castable किया जा रहा समाप्त होता है बनाने का प्रयास कर (शायद प्रकार पदोन्नति द्वारा), जो आमतौर पर अवांछनीय है। बूस्ट और माइक्रोसॉफ्ट कार्यान्वयन दोनों एक unspecified_bool_type() पर कास्टिंग शामिल एक चाल का उपयोग करने लगते हैं। क्या कोई यह समझा सकता है कि यह तंत्र कैसे काम करता है और यह अंतर्निहित सूचक प्रकार को अंतर्निहित कास्टिंग कैसे रोकता है?

+0

सभी महान उत्तरों, धन्यवाद। इसे भी नाम देने में सक्षम होना अच्छा - पहले सुरक्षित बूल मुहावरे में नहीं आया था। –

उत्तर

31

प्रश्न में वर्णित तकनीक safe bool idiom है।

सी ++ 11 के रूप में, वह मुहावरे अब आवश्यक नहीं है। समस्या का समाधान आधुनिक ऑपरेटर पर explicit कीवर्ड का उपयोग करने के लिए है:

explicit operator bool() { 
    return m_Ptr != nullptr; 
} 
+0

ओह, मुझे सुरक्षित बूल मुहावरे के बारे में पता था और हाल ही में 'स्पष्ट' रूपांतरण ऑपरेटर की खोज की गई, लेकिन मुझे इस लिल ''null_ptr' चीज़ के बारे में पता नहीं था। धन्यवाद :) –

3

आमतौर पर जो यह लौटाता है वह सदस्य सूचक होता है। सदस्य पॉइंटर्स को bool की तरह माना जा सकता है लेकिन bool करता है जो कई अंतर्निहित रूपांतरणों का समर्थन नहीं करते हैं।

4

चाल इस तरह काम करता है। आप अपने स्मार्ट सूचक प्रकार के अंदर यह सब परिभाषित करते हैं (इस मामले में, shared_ptr में):

private: 

    struct Tester 
    { 
    Tester(int) {} // No default constructor 
    void dummy() {} 
    }; 

    typedef void (Tester::*unspecified_bool_type)(); 

public: 

    operator unspecified_bool_type() const 
    { 
    return !ptr_ ? 0 : &Tester::dummy; 
    } 

ptr_ देशी सूचक स्मार्ट सूचक वर्ग के अंदर है।

आप देख सकते हैं, unspecified_bool_type एक प्रकार है कि किसी भी बाहरी कोड द्वारा पहुँचा नहीं जा सकता करने के लिए एक typedef, के बाद से Tester एक निजी struct है। लेकिन कॉलिंग कोड इस (अंतर्निहित) रूपांतरण को एक सूचक प्रकार में उपयोग कर सकता है और जांच सकता है कि यह शून्य है या नहीं। जो, सी ++ में, bool अभिव्यक्ति के रूप में उपयोग किया जा सकता है।

+0

'## ModelId' के साथ क्या हो रहा है? – kennytm

+0

@ केनीटीएम: क्षमा करें, बस इसे हटा दें। – Gorpik

+1

आपको 'परीक्षक = unspecified_bool_type' के लिए '! =' और '==' के कार्यान्वयन प्रदान करने की आवश्यकता है या आप कक्षा के उदाहरणों के बीच संकलित करने के बीच अर्थहीन तुलना की अनुमति देंगे। –

संबंधित मुद्दे