2011-11-07 3 views
6

को देखते हुए:सी ++ की कौन सी विशेषता टेम्पलेट कक्षाओं को टेम्पलेट तर्कों के बिना स्वयं को संदर्भित करने देती है?

template <typename T> 
class C { 
    C & operator ++() { ... } 
}; 

क्यों/कैसे C चर और प्रकार C बजाय C<T> नाम के लिए आवश्यक किया जा रहा के कार्यों की घोषणा करने की अनुमति है? मैंने कई पैरामीटर के साथ टेम्पलेट पर काम करने से पहले वास्तव में इसके बारे में सोचा नहीं था जो "स्वयं प्रकार" असुविधाजनक वर्तनी को दूर करेगा।

वहाँ इस बारे में मुझे पता होना चाहिए की किसी भी quirks हैं?

उत्तर

6

[n3290: 14.6.1/1]: सामान्य (गैर- टेम्पलेट) वर्गों की तरह, वर्ग टेम्पलेट्स एक इंजेक्शन-वर्ग-नाम (धारा 9) है। इंजेक्शन-वर्ग-नाम एक टेम्पलेट नाम या एक प्रकार- नाम रूप में इस्तेमाल किया जा सकता है। यह एक टेम्पलेट टेम्पलेट पैरामीटर के लिए एक टेम्पलेट तर्क-सूची साथ प्रयोग किया जाता है जब एक टेम्पलेट तर्क के रूप में, या में अंतिम पहचानकर्ता के रूप में सविस्तार-प्रकार-विनिर्देशक के एक दोस्त वर्ग टेम्पलेट घोषणा, यह कक्षा टेम्पलेट को ही संदर्भित करता है। अन्यथा, यह टेम्पलेट नाम टेम्पलेट-पैरामीटर <> में संलग्न वर्ग टेम्पलेट के के बाद के बराबर है।

जाहिर है, यह केवल एक सुविधा सुविधा है।

+3

कमाल क्या करना है, जबकि मैं गलत मार्ग ;-) के हवाले से की शक्ति उद्धृत था मानक - मानक के _any_ भाग, जाहिर है - इनकार नहीं किया जा सकता है! –

+0

आह, जिस अवधारणा को मैं याद कर रहा था वह था * इंजेक्शन-क्लास-नाम *। धन्यवाद! –

+0

@ बेन जैकसन: कोई समस्या नहीं! –

2

यह सिर्फ वाक्यात्मक चीनी है।

यह आप टेम्प्लेट पैरामीटर बदलना होगा अगर अपने तरीकों के हस्ताक्षर बदलने की जरूरत नहीं करने के लिए सुविधाजनक है।

2

सी को नाम सी के बजाय चर के चर और कार्यों को घोषित करने की अनुमति क्यों दी जाती है?

यह सिर्फ इस तरह निर्दिष्ट है। टेम्पलेट का नाम उसके शरीर में इंजेक्शन दिया गया है और इसका मतलब वास्तविक प्रकार (तर्क के साथ) है।

क्या इस बारे में मुझे कोई जानकारी है?

कुछ भी नहीं है गंभीर। तुम सिर्फ इस याद करने के लिए CRTP करने के लिए आधार वर्ग के लिए काम नहीं करता है, तो है, आपको लगता है कि दो लोग इस upvoted

template <class T> 
class A : public Base<A<T> > // not Base<A> 
+2

सिवाय इसके कि 'बेस' टेम्पलेट टेम्पलेट पैरामीटर की अपेक्षा करता है। ;) – Xeo

+0

@Xeo: हाँ, लेकिन सीआरटीपी में, बेस क्लास व्युत्पन्न प्रकार की अपेक्षा करता है। – jpalecek

+0

एक दूसरे को बाहर नहीं करता है। – Xeo

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