मुझे लगता है कोई आपको बता क्यों यह एक अच्छा विचार नहीं हो सकता है अधिक भार या विशेषज्ञता का उपयोग नहीं करना चाहिए। पर विचार करें:
template<class T> int foo(T a) {
if(isAString<T>()) {
return a.length();
} else {
return a;
}
}
आप एक पहली नजर है कि यह भी int
के लिए काम करेंगे क्योंकि यह केवल तार के लिए length
फोन करने की कोशिश करेंगे पर सोच सकते हैं। लेकिन वह अंतर्ज्ञान गलत है: संकलक अभी भी स्ट्रिंग शाखा की जांच करता है, भले ही वह शाखा रनटाइम पर नहीं ली जाती है। और यदि आप T
एक int है तो आप पाएंगे कि आप गैर-वर्गों पर सदस्य फ़ंक्शन को कॉल करने का प्रयास कर रहे हैं।
यही कारण है कि यदि आपको अलग-अलग व्यवहार की आवश्यकता है तो आपको कोड को अलग करना चाहिए। लेकिन विशेषज्ञता के बजाए ओवरलोडिंग का बेहतर उपयोग करें, क्योंकि यह समझना आसान है कि चीजें इसके साथ कैसे काम करती हैं।
template<class T> int foo(T a) {
return a;
}
int foo(std::string const& a) {
return a.length();
}
आपने व्यवहार के विभिन्न तरीकों के लिए भी कोड को अलग किया है। यह सब अब एक साथ चिपकाया नहीं है। ध्यान दें कि ओवरलोडिंग के साथ, पैरामीटर में अलग-अलग प्रकार के रूप हो सकते हैं और कंपाइलर अभी भी सही संस्करण का उपयोग करेगा यदि दोनों समान मिलान करते हैं, जैसा कि यहां है: कोई संदर्भ हो सकता है, जबकि दूसरा नहीं कर सकता है।
स्रोत
2010-02-15 11:04:26
क्यों नहीं करते आप "टेम्पलेट विनिर्देश रास्ता चाहते हैं "? –
"टेम्पलेट ओवरलोडिंग तरीका" का उपयोग करें :) –
आपको शायद व्यवहार की जांच करनी चाहिए, टाइप न करें। – MSalters