2011-09-23 33 views
6

बजेर्न स्ट्राउस्ट्रप सी ++ बुक (अध्याय 13, पृष्ठ 331) में, यह कहा गया है कि "टेम्पलेट पैरामीटर का उपयोग बाद के टेम्पलेट पैरामीटर की परिभाषा में किया जा सकता है"। और यह निम्नलिखित कोड देता है:टेम्पलेट पैरामीटर प्रकार होना चाहिए?

template<class T, T def_val> class Cont{ /* ... */ } 

क्या कोई इस टेम्पलेट का उपयोग करने का उदाहरण प्रदान कर सकता है। उदाहरण के लिए, कंटेंट की ऑब्जेक्ट को कैसे प्रारंभ करें? यह मुझे लगता है कि "def_val" एक प्रकार का तर्क नहीं है, और इसे <> में नहीं रखा जाना चाहिए। क्या मै गलत हु?

धन्यवाद एक बहुत

+3

आपको पता होना चाहिए कि यह केवल तभी वैध है जब टी एक अभिन्न प्रकार – Riga

उत्तर

7

आप कुछ इस तरह कर सकते हैं:

Cont<int, 6> cnt; 
//  ^as long as this is of type T (in this case int) 
// def_val will be of type int and have a value of 6 

खाका मानकों प्रकार के होने की आवश्यकता नहीं है।

यह केवल काम करता है T एक अभिन्न प्रकार है जब (int, unsigned, long, char आदि नहीं बल्कि float, std::string, const char*, आदि), @Riga उसका/उसकी टिप्पणी में उल्लेख किया है के रूप में।

6

def_val एक मूल्य के तर्क है। एक इन्स्टेन्शियशन ऐसा दिखाई दे सकता:

Cont<int, 1> foo; 

एक दिलचस्प मामले में जहां यह उपयोगी है जब आप टेम्पलेट paremeter के रूप में एक वर्ग सदस्यीय के लिए सूचक करना चाहते हैं:

template<class C, int C::*P> 
void foo(C * instance); 

यह हो सकता है foo सक्षम बनाता है किसी भी वर्ग के int के सदस्य के लिए एक सूचक के साथ तत्काल।

+2

है, हालांकि मुझे लगता है कि सही शब्द 'गैर-प्रकार टेम्पलेट पैरामीटर' है। – pmr

3

यहाँ कैसे ऊपर का दृष्टांत के एक उदाहरण है:

template<class T, T def_val> class Cont{ /* ... */ }; 

int main() 
{ 
    Cont<int,42> c; 
} 
2

T def_val प्रकार T (जो पहले से पारित किया गया था) का एक उद्देश्य है। इसका उपयोग कंटेनर में वस्तुओं को आरंभ करने के लिए किया जा सकता है, उदाहरण के लिए। का उपयोग करने के लिए, यह कुछ ऐसा दिखाई देगा:

Object init(0); 
Cont<Object, init> cont; 

(छद्म-कोड, Object स्पष्ट रूप से एक प्रकार है कि इस तरह से उपयोग करने के लिए कानूनी है होना चाहिए)

यही तो दूसरी टेम्पलेट पैरामीटर का उपयोग करता है। यह टेम्पलेट में शामिल है क्योंकि इसमें एक टेम्पलेट प्रकार है; def_valT टाइप होना चाहिए और ऑब्जेक्ट बनाया गया है जब इसे पारित किया जाना चाहिए।

+0

मुझे नहीं पता कि यह काम करता है या नहीं। शायद अगर ऑब्जेक्ट का कन्स्ट्रक्टर constexpr है? –

+0

एक अस्वीकरण का एक जोड़ा जोड़ा गया। – ssube

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