2012-10-16 23 views
5

मेरे पास हाल ही में मेरे हाथों में एक कोड के बारे में एक प्रश्न है।टेम्पलेट से विरासत सी ++


template< class I, class P, class D, unsigned int ID = 0 > 
class PathFilter : public Filter< I, P, 1 > 
{ 
... 
} 

template< class I, class A, unsigned int N = 1 > 
class Filter : public Algorithm< I, A > 
{ 
... 
} 

template< class I, class A > 
class Algorithm : public A //This line 
{ 
    ... 
} 
: मैं बस यह जानना चाहते हैं सी ++ टेम्पलेट्स प्रतिमान में यह निम्नलिखित विरासत (एक उदाहरण के रूप में सिर्फ 3 वर्गों) करने के लिए सही है या उपयोगी है चाहता हूँ

मेरा प्रश्न विशेष रूप से तीसरे उदाहरण में विरासत के बारे में है। क्या यह इतना 'सामान्य' बनाने के लिए उपयोगी है और सटीक नहीं है? अधिक सामान्य कोड द्वारा समझने योग्य कोड समझौता करना एक अच्छा विकल्प है?

मैं पहली बार पूछता हूं क्योंकि मैं सी ++ टेम्पलेट्स में एक विशेषज्ञ नहीं हूं, बल्कि इसलिए भी कि मुझे यह कोड टेम्पलेट्स का उपयोग करके समझने में मुश्किल लगता है (आमतौर पर टेम्पलेट्स के नाम इसकी सामग्री के बारे में कुछ भी नहीं कहते हैं)। कोई सलाह?

उत्तर

2

आप क्या कर रहे हैं मिश्रित वर्ग (विशेष रूप से, आपकी कक्षा Algorithm एक है)।

एक संदर्भ के रूप में, उदाहरण के लिए, http://en.wikipedia.org/wiki/Mixin या http://en.wikipedia.org/wiki/Composite_pattern से परामर्श ले सकते हैं।

वास्तव में आप "कुछ कार्यक्षमता (A द्वारा निर्दिष्ट) को विरासत में प्राप्त करने के लिए निर्दिष्ट कर रहे हैं या बस उप-वर्ग (यानी Algorithm) द्वारा पुन: उपयोग किया जा रहा है"। (सीआईटी। पहले लेख से)

दूसरे शब्दों में, आप स्वयं को (या आपका उपयोगकर्ता) Algorithm पर किसी भी तरह से "बाद में" व्यवहार जोड़ने या बदलने के लिए स्वतंत्र बना रहे हैं। आपका वास्तविक लाभ केवल संकलक पर भरोसा करने वाली लचीलापन प्राप्त करना है, न कि कुछ गतिशील-बाध्यकारी-जैसी तंत्र (उदाहरण के लिए वर्चुअल फ़ंक्शंस ओवरराइडिंग) पर। आपकी अंतिम वर्ग Algorithm<A>, वास्तव में, संकलन समय पर बनाया गया है और यह (अर्थात स्पष्ट नीति Algorithm में A इसे लिखने हाथ द्वारा सहित) संभवतः के रूप में वर्ग आप Algorithm<A> स्पष्ट रूप से लिख प्राप्त किया है के रूप में कुशल है।

संपादित:

मैं भी नीति आधारित डिजाइन के बारे में इस विकिपीडिया पृष्ठ (http://en.wikipedia.org/wiki/Policy-based_design) के लिए एक रूप देने के लिए सुझाव है।

वहां, नीतियों के नाम (आपके A) स्पष्ट नामों के साथ स्पष्ट रूप से दिखाई देते हैं, जैसा कि @ full.stack.ex द्वारा बुद्धिमानी से सलाह दी जाती है।

+1

तो, अगर आप यही चाहते हैं, ठीक है। पठनीयता के रूप में, सच है, टेम्पलेट पैरामीटर को अजीब तरह से नामकरण करने की एक परंपरा है - I, P, A, आदि लेकिन आपको यह नहीं करना है :)। उन्हें बेहतर नाम दें और वे स्वयं वर्णनात्मक बन सकते हैं। –

+1

आपके उत्तर के लिए धन्यवाद, लेकिन मुझे अभी भी एक प्रश्न है। मैं एक "उच्च" वर्ग में कुछ कार्यक्षमताओं की एक सामान्य और अमूर्त परिभाषा के उपयोग को समझता हूं। लेकिन टेम्पलेट का मुख्य उद्देश्य पैरामीटर प्रकारों को सामान्यीकृत नहीं करना है? तो मैं अंत में क्या कह रहा हूं कि मैं लगभग हर चीज को इस उच्च वर्ग में पास कर सकता हूं और निम्न-पदानुक्रम कार्यों को संरक्षित कर सकता हूं। अंत में मेरे पास ऑब्जेक्ट्स का एक बहुत ही सीमित सेट होगा जो निम्न कार्यों (शायद एक) को प्राप्त कर सकता है, क्या मैं गलत हूं? यह सामान्यता को परिभाषित करने के लिए एक अव्यवहारिक तरीका नहीं है? –