2008-08-25 22 views
70

सी ++ 0x में टेम्पलेट उपनाम हैं (कभी-कभी टेम्पलेट टाइपपीफ के रूप में जाना जाता है)। here देखें। सी ++ का वर्तमान नमूना नहीं है।टेम्पलेट टाइपपीफ - आपका काम क्या है?

आप आसपास के काम के रूप में उपयोग करना पसंद करते हैं? कंटेनर ऑब्जेक्ट्स या मैक्रोज़? क्या आपको इसके लायक लगता है?

+3

कुछ समय पहले इस विषय के साथ गॉट डॉट किया गया: http://www.gotw.ca/gotw/079.htm –

उत्तर

102

आप आसपास के काम के रूप में उपयोग करना पसंद करते हैं? कंटेनर ऑब्जेक्ट्स या मैक्रोज़? क्या आपको इसका लायक लगता है?

विहित तरीका इस प्रकार की तरह एक metafunction उपयोग करने के लिए है:

template <typename T> 
struct my_string_map { 
    typedef std::map<std::string, T> type; 
}; 

// Invoke: 

my_string_map<int>::type my_str_int_map; 

यह भी एसटीएल (allocator::rebind<U>) में और बूस्ट सहित कई पुस्तकालयों में प्रयोग किया जाता है। हम इसे bioinformatical library में बड़े पैमाने पर उपयोग करते हैं।

यह फूला हुआ है, लेकिन यह 99% समय का सबसे अच्छा विकल्प है। मैक्रोज़ का उपयोग करना कई डाउनसाइड्स के लायक नहीं है।

(संपादित करें:। के रूप में उनकी टिप्पणी में डेनियल ने कहा मैं बूस्ट/एसटीएल सम्मेलनों प्रतिबिंबित करने के लिए कोड में संशोधन किया गया है)

+3

यदि आप 'टाइप' (या इसके अतिरिक्त) के बजाय 'टाइप' का उपयोग करते हैं तो यह बेहतर काम करेगा Boost.MPL। जो उपयोगी हो सकता है, इसलिए मुझे लगता है कि यह प्रोत्साहित करने के लिए एक अच्छा सम्मेलन है। –

+0

क्या यह वास्तव में एक मेटाफंक्शन कहा जाता है? मुझे शक है। –

+5

@ जेनिकोडर: इसे मेटाफंक्शन कहने के लिए बिल्कुल उचित है, और अधिकांश सी ++ मेटाप्रोग्रामिंग विशेषज्ञ ऐसा करते हैं (उदाहरण के लिए बूस्ट लोग)। एक कठोर परिभाषा मौजूद नहीं है लेकिन व्यक्तिगत रूप से मैं सब कुछ एक मेटाफंक्शन कहता हूं, संकलन समय पर, कुछ इनपुट दिए गए एक प्रकार या संकलन-समय निरंतर उत्पन्न करता है। यही है, इनपुट से किसी भी मैपिंग को संकलन समय पर आउटपुट में। मुझे नहीं पता कि कोई और उचित या अधिक व्यापक रूप से स्वीकार्य परिभाषा मौजूद है। अंत में, क्या मैं पूछ सकता हूं कि आप इस शब्द के उपयोग के लिए क्यों ऑब्जेक्ट करते हैं? –

10
template <typename T> 
struct my_string_map : public std::map<std::string,T> 
{ 
}; 

आप वर्गों है कि नहीं है से विरासत नहीं करना चाहिए एक आभासी विनाशक है। यह व्युत्पन्न वर्गों में विनाशकों से संबंधित है जब उन्हें नहीं कहा जाना चाहिए और आप बिना आवंटित स्मृति के साथ समाप्त हो सकते हैं।

ऐसा कहा जा रहा है कि आप ***** शायद ***** उपर्युक्त उदाहरण में इससे दूर हो सकते हैं क्योंकि आप अपने व्युत्पन्न प्रकार में कोई और डेटा नहीं जोड़ रहे हैं। ध्यान दें कि यह एक अनुमोदन नहीं है। मैं अभी भी सलाह देता हूं कि ऐसा न करें। तथ्य यह है कि आप कर सकते हैं इसका मतलब यह नहीं है कि होना चाहिए।

संपादित करें: हाँ, यह ShaChris23 की पोस्ट का उत्तर है। मुझे शायद कुछ याद आया क्योंकि यह नीचे के बजाय उसके संदेश से ऊपर दिखाया गया था।

+3

क्या यह शाहरिस 23 की पोस्ट के जवाब के रूप में है? –

+0

ये मंच नहीं हैं, पोस्ट कालक्रम क्रम में प्रकट नहीं होते हैं। आम तौर पर, यह एक टिप्पणी होगी। आप नहीं कर सकते, तो शायद एक समुदाय विकी जवाब किया होगा। किसी भी तरह से, सवाल काफी पुराना है। – GManNickG

+4

मैंने देखा कि यह काफी पुराना है, लेकिन मैंने सोचा कि यह सुनिश्चित करना एक अच्छी बात थी कि यह गलत प्रथाओं को प्रोत्साहित नहीं कर रहा था। बाद में बात करता हूं – xghost

0

कभी-कभी आप सभी जरूरी प्रकारों के लिए अनजान टाइपिफ़ी को स्पष्ट रूप से लिख सकते हैं। यदि बेस क्लास कई टेम्पलेट्स पर टेम्पलेट किया गया है तो केवल टाइप किए जाने वाले वांछित एक प्रकार के साथ आप एक विशेष श्रेणी का उत्तराधिकारी हो सकते हैं जिसमें टाइपिफ़ प्रभावी ढंग से विरासत वाले वर्ग नाम में शामिल किया गया हो। यह दृष्टिकोण मेटाफंक्शन दृष्टिकोण से कम अव्यवस्थित है।

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