2011-06-12 11 views
18

टाइप मिटाएं - यह है कि आप इसे कैसे कहते हैं?सी ++ में मिटाएं टाइप करें: कितना बढ़ावा :: shared_ptr और boost :: function work?

कैसे boost::shared_ptr अपने डिलीटर स्टोर करता है और कैसे boost::function अपने फ़ंक्शन ऑब्जेक्ट को स्टोर करता है?

क्या कोई ट्यूटोरियल है जो चाल को सिखाता है?

टाइप-मिस्ड फ़ंक्शन ऑब्जेक्ट्स का उपयोग करने की रन-टाइम लागत क्या है?

+2

क्या आपने पूछने से पहले Google को करने का प्रयास किया था? वेब पर बहुत सारी जानकारी है। पुराना थामास बेकर लेख: http://www.artima.com/cppsource/type_erasure.html या यह प्रसिद्ध पुस्तक: http://www.boostpro.com/mplbook/ और कई अन्य संसाधन। –

+14

@ जीनबुशुएव: एसओ का पूरा उद्देश्य मूल रूप से Google को अनावश्यक खोज करने के लिए है। यदि आप कुछ प्रोग्रामिंग से संबंधित विषय के बारे में जानना चाहते हैं, तो आप इसे Google कर सकते हैं, और या तो (1) एक SO उत्तर ढूंढ सकते हैं, या (2) अविश्वसनीय जानकारी प्राप्त करें जो सही हो सकती है या नहीं भी हो सकती है। या आप (2) एसओ पर खोज/पूछ सकते हैं, और उन उत्तरों को प्राप्त कर सकते हैं जो सहकर्मी-समीक्षा की जाती हैं, गुणवत्ता द्वारा मूल्यांकन की जाती हैं, और व्यावहारिक रूप से उपयोगी होने की गारंटी देती हैं। कृपया यहां प्रश्न पूछने के बजाय लोगों को Google को न बताएँ। यह प्रतिकूल है। – jalf

उत्तर

23

विचार सरल है, आप एक बेस क्लास को परिभाषित करते हैं जिसमें आपकी आवश्यक कार्यक्षमता वाला एक इंटरफ़ेस है, और उसके बाद से प्राप्त होता है। चूंकि प्रकार मिटा दिया गया वर्ग केवल उस इंटरफ़ेस का उपयोग करता है, वास्तविक प्रकार और मिटा दिया गया है। वैकल्पिक रूप से, यदि केवल आवश्यक इंटरफेस को मुफ्त कार्यों के रूप में व्यक्त किया जा सकता है तो आप पॉइंटर्स को मुफ्त कार्यों में स्टोर कर सकते हैं।

namespace detail { 
    struct deleter_base { 
     virtual ~deleter_base() {} 
     virtual void operator()(void*) = 0; 
    }; 
    template <typename T> 
    struct deleter : deleter_base { 
     virtual void operator()(void* p) { 
     delete static_cast<T*>(p); 
     } 
    }; 
} 
template <typename T> 
class simple_ptr { 
    T* ptr; 
    detail::deleter_base* deleter; 
public: 
    template <typename U> 
    simple_ptr(U* p) { 
     ptr = p; 
     deleter = new detail::deleter<U>(); 
    } 
    ~simple_ptr() { 
     (*deleter)(ptr); 
     delete deleter; 
    } 
}; 

यह वास्तव में सरल स्मार्ट पॉइंटर है, लेकिन विचार वहां है। shared_ptr के विशेष मामले में, हटाए गए को पॉइंटर द्वारा संदर्भित संदर्भ गणना ऑब्जेक्ट के हिस्से के रूप में संग्रहीत किया जाता है।

+0

shared_ptr डिलीटर को किसी भी चीज़ से प्राप्त नहीं किया जाना चाहिए। – pic11

+5

@ pic11: 'shared_ptr' में पास किए गए हटाए जाने वाले को उत्तराधिकारी की आवश्यकता नहीं है, * लेकिन * टाइप एरर आंतरिक रूप से विरासत (या फ़ंक्शन पॉइंटर्स) का उपयोग करके कार्यान्वित किया जाता है। –

+0

यदि आप अपने स्थिर प्रकार को नहीं जानते हैं और/या यह बेस क्लास से प्राप्त नहीं होता है तो आप फ़ंक्शन ऑब्जेक्ट को कैसे कॉल करते हैं? – pic11

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