आप पूरी तरह से एक सदस्य चुनिंदा विशेषज्ञ कर सकते हैं:
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; }
};
एक वैकल्पिक दृष्टिकोण अपना सामान ऊपर (एक आधार वर्ग में आम सामान विभाजित करने के लिए है, और विशेष व्युत्पन्न कक्षा में सामान) जैसे निक की सिफारिश की जाती है।
मैं आमतौर पर दूसरा दृष्टिकोण लेता हूं। लेकिन अगर मैं कार्यों को आंशिक विशेषज्ञता देने की आवश्यकता नहीं है तो मैं पहले व्यक्ति को पसंद करता हूं।
स्रोत
2009-01-31 18:06:09
इस पर अधिक विस्तृत जानकारी के लिए, स्कॉट मेयर्स के "प्रभावी सी ++, तीसरे संस्करण" में "आइटम 44: फैक्टर पैरामीटर-टेम्पलेट्स से स्वतंत्र कोड" देखें –