अक्सर जब टेम्पलेट्स के साथ काम, आप की तरह कुछ के साथ समाप्त:सी ++ टेम्पलेट मैक्रो शॉर्टकट
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)
...
};
यह क्लीनर लगता है, और दोहराव से बचा जाता है जब मैं अन्य टेम्पलेट वर्गों इसे सार्थक की तरह कुछ बनाने के लिए है। क्या यह अच्छी चीज है? या क्या मुझे इससे बचना चाहिए और सिर्फ टाइपपीफ कॉपी करना चाहिए?
धन्यवाद, मैंने इसके बारे में भी सोचा नहीं था। – Corey
+1 यह भी कारण है कि अनौपचारिक और बाइनरी फ़ंक्शन से म्यूटर्स का उत्तराधिकारी होना। मैं वास्तव में एक संबंधित सवाल था, कैसे ** ** ** tyleffs में उन typedefs का उपयोग करेगा (मान लीजिए कि वे कुछ मेटाप्रोग्रामिंग वूडू के माध्यम से प्राप्त किए जाते हैं) लेकिन http://www.parashift.com/c++-faq-lite/templates.html से # faq-35.18 ऐसा प्रतीत होता है कि कोई * सार्थक * तरीका नहीं है ... – UncleBens
-1 मुझसे। मैं "इस आश्रित बेस क्लास में नहीं मिले नाम" मुद्दे के कारण इस समाधान से असहमत हूं। इन सदस्यों में से किसी एक के लिए प्रत्येक संदर्भ को निम्नानुसार योग्यता प्राप्त करनी होगी: "typename template_defs ::"। उदाहरण के लिए यदि आप "const_reference" का संदर्भ लेना चाहते हैं, तो आपको "typename template_defs :: const_reference" कहना होगा जो वास्तव में बहुत बेहतर नहीं है। एक समाधान जो टेम्पलेट के साथ मैक्रो संस्करण को मिश्रित करता है, ठीक हो सकता है। –