2011-06-09 19 views
33
template<> 
class A{ 
//some class data 
}; 

मैंने इस तरह के कोड को कई बार देखा है। उपरोक्त कोड में template<> का उपयोग क्या है? और ऐसे मामले क्या हैं जहां हमें इसका उपयोग करने की आवश्यकता है?सी ++ में खाली कोण ब्रैकेट के साथ टेम्पलेट <> का अर्थ क्या है?

+2

ओह ... मैंने इसे "टेम्पलेट <>" के साथ पोस्ट करने से पहले इसे Google पर करने का प्रयास किया जो मुझे अच्छे नतीजे नहीं देता है। सही खोज कुंजी शब्द के लिए धन्यवाद। लेकिन मुझे लगता है कि एसओ के पास इसके अच्छे जवाब हैं। – Vijay

उत्तर

54

template<> संकलक को बताता है कि एक टेम्पलेट विशेषज्ञता निम्नानुसार है, विशेष रूप से पूर्ण विशेषज्ञता। आम तौर पर, class A कुछ इस तरह दिखाई करना होगा:

template<class T> 
class A{ 
    // general implementation 
}; 

template<> 
class A<int>{ 
    // special implementation for ints 
}; 

अब, जब भी A<int> प्रयोग किया जाता है, विशेष संस्करण का उपयोग किया जाता है। तुम भी उपयोग कर सकते हैं कार्यों विशेषज्ञ:

template<class T> 
void foo(T t){ 
    // general 
} 

template<> 
void foo<int>(int i){ 
    // for ints 
} 

// doesn't actually need the <int> 
// as the specialization can be deduced from the parameter type 
template<> 
void foo(int i){ 
    // also valid 
} 

आम तौर पर हालांकि, आप simple overloads are generally considered superior के रूप में कार्य के विशेषज्ञ नहीं करना चाहिए,:

void foo(int i){ 
    // better 
} 

और अब, यह overkill, पीछा कर रहा है बनाने के लिए एक आंशिक विशेषज्ञता:

template<class T1, class T2> 
class B{ 
}; 

template<class T1> 
class B<T1, int>{ 
}; 

वो एक पूर्ण विशेषज्ञता के रूप में एक ही तरह से rks, बस जब भी दूसरा टेम्पलेट पैरामीटर int (उदाहरण के लिए, B<bool,int>, B<YourType,int>, आदि) विशेष संस्करण का उपयोग किया जाता है।

+0

@ नवाज: फिर भी? : पी – Xeo

+2

+1 अच्छा जवाब! शायद आपको यह जोड़ना चाहिए कि यह एक पूर्ण टेम्पलेट विशेषज्ञता है। हालांकि .. एक टेम्पलेट पैरामीटर के साथ, वैसे भी कोई आंशिक विशेषज्ञता संभव नहीं है। – Christian

+0

@ क्रिस्टियन: बस उसमें संपादन कर रहा था! – Xeo

7

सही दिखता नहीं है। अब, आप के बजाय लिखा हो सकता है:

template<> 
class A<foo> { 
// some stuff 
}; 

... किस प्रकार foo के लिए एक टेम्पलेट विशेषज्ञता होगा।

8

template<> टेम्पलेट का कुल विशेषज्ञता प्रस्तुत करता है। आपका उदाहरण वास्तव में मान्य नहीं है; आप एक अधिक विस्तृत परिदृश्य की जरूरत है इससे पहले कि यह उपयोगी हो जाता है: "। आंशिक विशेषज्ञता"

template <typename T> 
class A 
{ 
    // body for the general case 
}; 

template <> 
class A<bool> 
{ 
    // body that only applies for T = bool 
}; 

int main() 
{ 
    // ... 
    A<int> ai; // uses the first class definition 
    A<bool> ab; // uses the second class definition 
    // ... 
} 

यह अजीब लग रहा है, क्योंकि यह एक अधिक शक्तिशाली सुविधा है, जो कहा जाता है की एक विशेष मामला है

+0

स्पष्ट (नहीं "कुल") विशेषज्ञता आंशिक विशेषज्ञता का एक विशेष मामला नहीं है। स्पष्ट विशेषज्ञता एक टेम्पलेट-आईडी द्वारा पहचाने गए वर्ग को परिभाषित करती है; आंशिक विशेषज्ञता प्राथमिक टेम्पलेट के माध्यम से उपयोग किए गए एक नए टेम्पलेट को परिभाषित करती है। – Potatoswatter

+1

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

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