2009-10-07 13 views
8

अक्सर जब टेम्पलेट्स के साथ काम, आप की तरह कुछ के साथ समाप्त:सी ++ टेम्पलेट मैक्रो शॉर्टकट

template <T> 
class the_class 
{ 
public: 
    // types 
    typedef T value_type; 
    typedef const value_type const_value_type; 

    typedef value_type& reference; 
    typedef const_value_type& const_reference; 

    typedef value_type* pointer; 
    typedef const_value_type* const_pointer; 

    ... 
}; 

यह बहुत की एक ही सामान का है, हालांकि, विभिन्न टेम्प्लेट की कक्षाओं के बहुत सारे पर बनाई गई।

// template_types.h 

#define TEMPLATE_TYPES(T) \ 
     typedef T value_type; \ 
     typedef const value_type const_value_type; \ 
     typedef value_type& reference; \ 
     typedef const_value_type& const_reference; \ 
     typedef value_type* pointer; \ 
     typedef const_value_type* const_pointer; 

तो मेरी कक्षा बस हो जाता है::

#include "template_types.h" 

template <typename T> 
class the_class 
{ 
public: 
    TEMPLATE_TYPES(T) 
    ... 
}; 

यह क्लीनर लगता है, और दोहराव से बचा जाता है जब मैं अन्य टेम्पलेट वर्गों इसे सार्थक की तरह कुछ बनाने के लिए है। क्या यह अच्छी चीज है? या क्या मुझे इससे बचना चाहिए और सिर्फ टाइपपीफ कॉपी करना चाहिए?

उत्तर

15

निश्चित रूप से, आप जो कर रहे हैं वह काम करेगा, लेकिन यह पुराना स्कूल है। क्या आपने उस सामान को किसी अन्य टेम्पलेट वर्ग में रखने की कोशिश की है जिसे आप प्राप्त कर सकते हैं?

template <typename T> 
class template_defs 
{ 
public: 
    // types 
    typedef T value_type; 
    typedef const value_type const_value_type; 
    typedef value_type& reference; 
    typedef const_value_type& const_reference; 
    typedef value_type* pointer; 
    typedef const_value_type* const_pointer; 
}; 

template <typename T> 
class the_class : public template_defs<T> 
... 
+1

धन्यवाद, मैंने इसके बारे में भी सोचा नहीं था। – Corey

+2

+1 यह भी कारण है कि अनौपचारिक और बाइनरी फ़ंक्शन से म्यूटर्स का उत्तराधिकारी होना। मैं वास्तव में एक संबंधित सवाल था, कैसे ** ** ** tyleffs में उन typedefs का उपयोग करेगा (मान लीजिए कि वे कुछ मेटाप्रोग्रामिंग वूडू के माध्यम से प्राप्त किए जाते हैं) लेकिन http://www.parashift.com/c++-faq-lite/templates.html से # faq-35.18 ऐसा प्रतीत होता है कि कोई * सार्थक * तरीका नहीं है ... – UncleBens

+1

-1 मुझसे। मैं "इस आश्रित बेस क्लास में नहीं मिले नाम" मुद्दे के कारण इस समाधान से असहमत हूं। इन सदस्यों में से किसी एक के लिए प्रत्येक संदर्भ को निम्नानुसार योग्यता प्राप्त करनी होगी: "typename template_defs ::"। उदाहरण के लिए यदि आप "const_reference" का संदर्भ लेना चाहते हैं, तो आपको "typename template_defs :: const_reference" कहना होगा जो वास्तव में बहुत बेहतर नहीं है। एक समाधान जो टेम्पलेट के साथ मैक्रो संस्करण को मिश्रित करता है, ठीक हो सकता है। –

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