2010-04-28 8 views
10
template <class T> 
void max (T &a ,T &b) 
{}//generic template #1 

template<> void max(char &c, char &d) 
{} //template specializtion #2 

void max (char &c, char &d) 
{}//ordinary function  #3 

1, 2, और 3 के बीच क्या अंतर है?टेम्पलेट स्पष्टीकरण विशेषज्ञता और सामान्य कार्य के बीच क्या अंतर है?

+1

आप फ़ंक्शन टेम्पलेट्स का विशेषज्ञ नहीं हो सकते हैं, प्रभाव सामान्य ओवरलोड के समान होगा। – AshleysBrain

+5

@AshleysBrain: यह गलत है। आप फंक्शन टेम्पलेट्स विशेषज्ञ कर सकते हैं। आप केवल आंशिक विशेषज्ञता नहीं कर सकते हैं। – sbi

+0

ओह, यही मेरा मतलब था। धन्यवाद। – AshleysBrain

उत्तर

10
  1. एक टेम्पलेट समारोह
  2. पिछले टेम्पलेट समारोह की कुल विशेषज्ञता है
  3. समारोह

यहाँ की एक अधिभार है C++ Coding Standards: 101 Rules, Guidelines, and Best Practices से एक अंश है :

66) फ़ंक्शन टेम्पलेट्स का विशेषज्ञ न करें

फ़ंक्शन टेम्पलेट विशेषज्ञता कभी अधिभार में भाग नहीं लेती है: इसलिए, आपके द्वारा लिखे गए कोई भी विशेषज्ञ इस बात को प्रभावित नहीं करेंगे कि कौन सा टेम्पलेट उपयोग किया जाता है, और इससे अधिकांश लोगों की अपेक्षा की जा सकती है। आखिरकार, यदि आपने फ़ंक्शन टेम्पलेट विशेषज्ञता के बजाए समान हस्ताक्षर के साथ एक नॉनटेम्प्लेट फ़ंक्शन लिखा था, तो नॉनटेम्प्लेट फ़ंक्शन हमेशा चुना जाएगा क्योंकि इसे हमेशा टेम्पलेट की तुलना में बेहतर मिलान माना जाता है।

#include <algorithm> 

template<typename T> 
struct max_implementation 
{ 
    T& operator() (T& a, T& b) 
    { 
    return std::max(a, b); 
    } 
}; 

template<typename T> 
T& max(T& a, T& b) 
{ 
    return max_implementation<T>()(a, b); 
} 

भी देखें:

पुस्तक एक वर्ग टेम्पलेट के मामले में समारोह टेम्पलेट को लागू करने से अविवेक का एक स्तर जोड़ने के लिए सलाह देते हैं

+0

मैंने कोड में टाइपो को ठीक किया है, उस –

+0

के लिए खेद है, जो मिल गया लिंक मिला है, जैसा कि @Michael –

+0

thanx द्वारा दिया गया था, मैं इस बिंदु को समझता हूं :) – Suri

2

टेम्पलेट पैरामीटर के मिलान मिलान नियम अधिभारित कार्यों से अलग हैं। अलग देखा जा सकता है क्या जब आप अलग tyoes के तर्क के साथ max() आह्वान करने के लिए कोशिश का एक उदाहरण:

max(1,'2'); 

यह अतिभारित समारोह से मेल खाएगा, लेकिन न तो मूल टेम्पलेट और न ही विशेषज्ञता। (ओवरलोड नहीं है!)

+0

कोड के प्रारंभिक पढ़ने में, मुझे अधिभार और विशेषज्ञता के बीच हस्ताक्षर में कोई अंतर नहीं दिखता है, अन्य टेम्पलेट की तुलना में। फिर, 'अधिकतम (1,' 2 ') क्यों विशेषज्ञता से मेल नहीं खाया जाएगा? अधिक विशेष रूप से, '1', एक 'int' क्यों है, अधिभार मामले में' char' में परिवर्तित किया गया है लेकिन विशेषज्ञता के मामले में नहीं? – rcollyer

+0

@rcollyer: ग्रेगरीज़ उत्तर में उद्धरण * # 66 * देखें। –

+0

@rcollyer: सरल उत्तर यह है: _B क्योंकि मानक कहता है ._ 'टेम्पलेट <> शून्य अधिकतम (...)' टेम्पलेट के लिए वाक्यविन्यास __specialization__ है; 'शून्य अधिकतम (...)' फ़ंक्शन __overload__ के लिए वाक्यविन्यास है। ओवरलोड किए गए कार्यों से मेल खाने के नियम टेम्पलेट विशेषज्ञता मिलान करने के नियमों से अलग हैं। (और ओवरलोड को _first_ चुना जाता है और केवल तभी जब कोई टेम्पलेट चुना जाता है, तो संभावित विशेषज्ञता माना जाता है।) अधिभार चुनने से विशेषज्ञों को चुनने से कहीं अधिक आराम क्यों होता है, मैं नहीं कह सकता। लेकिन मुझे लगता है कि, overloads के लिए नियम होगा _now_, वे भी कठोर होगा। – sbi

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