2009-01-31 9 views
5

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

धन्यवाद।

उत्तर

10

आप पूरी तरह से एक सदस्य चुनिंदा विशेषज्ञ कर सकते हैं:

template<int N> 
struct Vector { 
    int calculate() { return N; } 
}; 

// put into the .cpp file, or make inline! 
template<> 
int Vector<3>::calculate() { return -1; } 

आप एक पूरे विशेषज्ञता है। जिसका अर्थ है आप आंशिक यह नहीं विशेषज्ञ कर सकते हैं:

template<int N, int P> 
struct Vector { 
    int calculate() { return N; } 
}; 

// WROOONG! 
template<int N> 
int Vector<N, 3>::calculate() { return -1; } 

आपको लगता है कि जरूरत है, तो आप enable_if उपयोग कर सकते हैं:

template<int N, int P> 
struct Vector { 
    int calculate() { return calculate<P>(); } 
private: 
    // enable for P1 == 3 
    template<int P1> 
    typename enable_if_c<P1 == P && P1 == 3, int>::type 
    calculate() { return -1; } 

    // disable for P1 == 3 
    template<int P1> 
    typename enable_if_c<!(P1 == P && P1 == 3), int>::type 
    calculate() { return N; } 
}; 

एक वैकल्पिक दृष्टिकोण अपना सामान ऊपर (एक आधार वर्ग में आम सामान विभाजित करने के लिए है, और विशेष व्युत्पन्न कक्षा में सामान) जैसे निक की सिफारिश की जाती है।

मैं आमतौर पर दूसरा दृष्टिकोण लेता हूं। लेकिन अगर मैं कार्यों को आंशिक विशेषज्ञता देने की आवश्यकता नहीं है तो मैं पहले व्यक्ति को पसंद करता हूं।

4

मैंने स्थिति उत्पन्न होने पर आमतौर पर बेस क्लास का उपयोग किया है। Ie: बेस क्लास में सामान्य कार्यक्षमता डालें, और उससे टेम्पलेट क्लास प्राप्त करें, फिर व्युत्पन्न क्लास को केवल उन कार्यों के साथ विशेषज्ञ करें जो अलग हैं।

+0

इस पर अधिक विस्तृत जानकारी के लिए, स्कॉट मेयर्स के "प्रभावी सी ++, तीसरे संस्करण" में "आइटम 44: फैक्टर पैरामीटर-टेम्पलेट्स से स्वतंत्र कोड" देखें –

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