2011-12-01 10 views
7

एक लेख पढ़ रहा है, मैं निम्न सिंटैक्स में आए:कक्षा के आधार पर किसी वर्ग को टेम्पलेट से कैसे प्राप्त किया जा सकता है?

template <typename T> 
class MyTemplate 
{ 
    T* member; 
    T* method(); 
    // ... 
} 

class MyClass : public MyTemplate<MyClass> 
{ 
    // ... 
} 

मैं बिल्कुल समझ में नहीं आता कि कैसे MyClass है जो अपने आप पर आधारित है एक टेम्पलेट से विरासत कर सकते हैं। क्या आप कृपया बता सकते हैं कि यह कैसे काम करता है?

उत्तर

8

इसे Curiously Recurring Template Pattern, या संक्षिप्त के लिए सीआरटीपी कहा जाता है। यह इस तथ्य का लाभ उठाकर स्थिर पॉलीमोर्फिज्म के प्रभाव को प्राप्त करने के लिए प्रयोग किया जाता है कि जब तक आप लाइन class MyClass : public MyTemplate<MyClass> में MyClass प्राप्त करते हैं, तो अर्ध-परिभाषित (यह एक अपूर्ण प्रकार है) ताकि आप पॉइंटर्स को उस प्रकार से स्टोर कर सकें, इत्यादि, और इसके साथ चीजें करें जिन्हें पूर्ण प्रकार की आवश्यकता नहीं है।

+0

मैं नहीं कहूंगा कि 'MyClass' अपूर्ण है। यह मामला हो सकता है कि आप इस वर्ग के लिए कुछ सामान्य कार्यक्षमता प्रदान की जानी चाहिए। उदाहरण के लिए [उदाहरण] (http://drdobbs.com/cpp/184403484)। 'सार्वजनिक MyTemplate ' के बिंदु पर –

+1

@ आर.के., 'माइक्लास' वास्तव में एक अधूरा प्रकार है। इसका मतलब है कि आप पॉइंटर्स और संदर्भों को स्टोर कर सकते हैं, आदि –

+0

हां, आप सही हैं। अब जब मैं आपका विवरण दोबारा पढ़ता हूं, तो यह सही है। मैंने सोचा था कि आपका मतलब है कि MyClass, उदाहरण के लिए, एक अधूरा प्रकार है। –

2

क्या आप कृपया यह बता सकते हैं कि यह कैसे काम करता है?

उम ... यह बस .. करता है? मानक विशेष रूप से टेम्पलेट मानकों को अपूर्ण प्रकार के होने की अनुमति देता है। और चूंकि CRTP बेस क्लास में कोई विधि पूरी तरह परिभाषित प्रकार की आवश्यकता नहीं है, सबकुछ ठीक है।

§3.9.2 p3 [basic.compound]
अधूरा प्रकार के प्वाइंटर अनुमति दी जाती है, यद्यपि वहाँ क्या उन्हें (3.11) के साथ किया जा सकता है पर प्रतिबंध है।

§14.3.1 पी 2 [temp.arg.type]
[नोट: एक टेम्पलेट प्रकार तर्क एक अपूर्ण प्रकार (3.9) हो सकता है। -जेंड नोट]

2

इसे सीआरटीपी कहा जाता है। इसका उपयोग स्थैतिक बहुरूपता के लिए किया जाता है जो वर्चुअल का उपयोग करने से तेज़ हो सकता है।

: public MyTemplate<MyClass> 

MyTemplate<MyClass> को दर्शाता है, हालांकि बाद से MyClass अधूरा है आप केवल तरीके कि एक पूरा प्रकार की आवश्यकता नहीं है में T उपयोग कर सकते हैं। जैसे कि पॉइंटर का उपयोग करना या सदस्य फ़ंक्शन को कॉल करना।

वैसे भी, सिर्फ अपने टुकड़ा को देखो, यह अनिवार्य रूप से इस रूप में एक ही है:

class MyClass 
{ 
    MyClass* member; 
    MyClass* method(); 
} 

जो पूरी तरह से कानूनी और समझा जा सकता है।

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

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