2011-09-02 21 views
5

मुझे सी ++ टेम्पलेट टेम्पलेट पैरामीटर के सिंटैक्स को समझने में कठिनाई हो रही है। मैं समझता हूं कि वे उपयोगी क्यों हैं, उत्कृष्ट वर्णन here के अनुसार, मुझे बस समझने के लिए उनके वाक्यविन्यास को मुश्किल लगता है। ऊपर वेबसाइट से ली गई दो उदाहरण (वहाँ दूसरों रहे हैं):सी ++ टेम्पलेट टेम्पलेट पैरामीटर का सिंटेक्स

template <typename T, template <typename> class Cont> 
class Stack; 

और

template <template <typename,typename> class Cont> 
class Wrapper3; 

जाहिर है सामान्यीकरण ऐसी घोषणाओं इस वाक्य रचना के पीछे तर्क के कुछ समझ के बिना असंभव है। याद रखना कठिन है और यह बहुत मदद नहीं करता है।

संपादित करें: मुझे एहसास है कि एक प्रश्न पर मेरा प्रयास एक अवलोकन की तरह आया। मैं जो पूछ रहा हूं वह हर रोज बोलने में टेम्पलेट टेम्पलेट पैरामीटर सिंटैक्स को कैसे समझने के लिए मदद करता है। मैं इसे सी ++ वाक्यविन्यास और अन्य सभी प्रोग्रामिंग भाषाओं के साथ कर सकता हूं जो मैंने सीखा है। हालांकि मुझे अपने लिए सी ++ टेम्पलेट टेम्पलेट पैरामीटर के सिंटैक्स को "समझा" में कठिनाई हो रही है। मुझे डेविड वंदेवोर्डे और निकोलाई एम जोसुटिस द्वारा "सी ++ टेम्पलेट्स: पूर्ण मार्गदर्शिका" मिली है, और यह एक अच्छी किताब है, लेकिन मुझे यह वाक्यविन्यास समझने में बहुत मदद नहीं मिली है जो मुझे यकीन है कई सहमत होंगे सबसे अच्छा quirky पर।

+4

आपका प्रश्न वास्तव में क्या है? –

+0

मुझे लगता है कि वह दो टेम्पलेट वर्ग – xanatos

+0

के बीच अंतर को समझ नहीं पा रहा है, मैं समझता हूं कि दोनों अलग-अलग टेम्पलेट वर्ग हैं। मेरे पास जो समस्या है वह टेम्पलेट टेम्पलेट पैरामीटर के सिंटैक्स के साथ है। – Olumide

उत्तर

4

कुछ भी नहीं है इसके बारे में इतना आर्केन। बस मूल टेम्पलेट से अपने टेम्पलेट टेम्पलेट मापदंडों बाहर ले:

template <typename> class Cont 

एक ही प्रकार के तर्क फिट बैठता है के साथ किसी भी वर्ग टेम्पलेट, इस तरह के रूप में

template <typename T> 
class A { 
public: 
    A(T t) : t_(t) {} 
    T get() { return t_; } 
private: 
    T t_; 
}; 

और तुम

Stack<int, A> s; 
रूप में अपने मूल टेम्पलेट का प्रयोग करेंगे
16

मुझे यकीन नहीं है कि आपका प्रश्न वास्तव में क्या है, लेकिन यहां आपके द्वारा दिए गए दो उदाहरणों के लिए स्पष्टीकरण दिया गया है।

template <typename T, template <typename> class Cont> 
class Stack; 

Stack दो टेम्पलेट मानकों के साथ एक वर्ग टेम्पलेट है। पहला पैरामीटर, T किसी भी प्रकार का हो सकता है (अंतर्निहित प्रकार, उपयोगकर्ता परिभाषित प्रकार, टेम्पलेट इंस्टॉलेशन और अन्य सहित)। दूसरा पैरामीटर, Cont, एक पैरामीटर ले जाने वाला क्लास टेम्पलेट होना चाहिए। पैरामीटर का नाम बदल दिया गया है क्योंकि इससे ज्यादा समझ नहीं आती है (पैरामीटर कभी भी कुछ भी बाध्य नहीं होता है)।

template <template <typename,typename> class Cont> 
class Wrapper3; 

Wrapper3 एक एकल पैरामीटर, Cont के साथ एक कक्षा टेम्पलेट है। Cont दो पैरामीटर के साथ एक वर्ग टेम्पलेट होना चाहिए।

टेम्पलेट टेम्पलेट पैरामीटर को परिभाषित करने के लिए वाक्यविन्यास एक वर्ग टेम्पलेट (template <typename [param1], typename [param2], ...> class Name) को परिभाषित करने के लिए समान है, इसलिए मुझे वास्तव में समझ में नहीं आता कि आपकी समस्या क्या है।

हालांकि, मैं मानता हूँ कि वाक्य रचना थोड़ा अजीब हो सकता है जब आप "घोंसले" टेम्पलेट टेम्पलेट मापदंडों शुरू:

// class template whose parameter must be a class template whose parameter 
// must be a class template 
template <template <template <typename> class > class C > 
struct Wow {}; 

अक्सर ऐसा नहीं करता है, हालांकि ...

+0

_ "[टेम्पलेट टेम्पलेट] पैरामीटर का नाम बदल दिया गया है क्योंकि यह अधिक समझ नहीं पाएगा (पैरामीटर कभी भी कुछ भी बाध्य नहीं है)" _। इसका मतलब है 'टेम्पलेट <टेम्पलेट कक्षा सी> कक्षा Foo {सी myField;} 'की अनुमति नहीं है? – mucaho

+1

@mucaho आप पैरामीटर को एक नाम दे सकते हैं, लेकिन आप इसका उपयोग नहीं कर सकते हैं, क्योंकि यह किसी भी प्रकार से कभी भी बाध्य नहीं होता है। उदाहरण के लिए, मान लीजिए कि आपके पास कक्षा' टेम्पलेट है कक्षा बार {} ': आप इसका उपयोग 'Foo' को तत्काल करने के लिए कर सकते हैं:' Foo f'। ई द्वारा प्रतिनिधित्व प्रकार क्या है इस मामले में? यदि आप 'Foo >' लिखना चाहते हैं, तो आपको टेम्पलेट टेम्पलेट पैरामीटर की आवश्यकता नहीं है, केवल एक नियमित गैर-टेम्पलेट पैरामीटर। –

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