मैं केवल कुछ अंतरों के बारे में सोच सकता हूं - यहां कुछ उदाहरण हैं जो आवश्यक रूप से नुकसान (मुझे लगता है) नहीं है। मैं इसे
template <typename T> T inc(const T& t);
namespace G { using ::inc; }
template <> int inc(const int& t);
namespace G { void f() { G::inc(10); } } // uses explicit specialization
// --- against ---
template <typename T> T inc(const T& t);
namespace G { using ::inc; }
int inc(const int& t);
namespace G { void f() { G::inc(10); } } // uses template
है ऐसा इसलिए है क्योंकि विशेषज्ञताओं नाम देखने से नहीं मिला रहे हैं संक्षिप्त रखने के लिए परिभाषाओं को छोड़ते हुए हूँ, लेकिन तर्क से मेल खाते से, तो एक का उपयोग कर घोषणा स्वचालित रूप से एक बाद में शुरू विशेषज्ञता पर विचार करेगी।
फिर, आप निश्चित रूप से फ़ंक्शन टेम्पलेट्स का आंशिक रूप से विशेषज्ञ नहीं हो सकते हैं।ओवरलोडिंग हालांकि बहुत आंशिक आदेश से कुछ इसी तरह सिद्ध (अब अलग अलग प्रकार का उपयोग कर, मेरी बात बनाने के लिए)
template <typename T> void f(T t); // called for non-pointers
template <typename T> void f(T *t); // called for pointers.
int a;
void e() {
f(a); // calls the non-pointer version
f(&a); // calls the pointer version
}
कि समारोह टेम्पलेट स्पष्ट विशेषज्ञता के साथ संभव नहीं होगा।
template<typename T> void f(T const &);
template<> void f(int * const &);
template<typename T> void g(T const &);
void g(int * const &);
int a[5];
void e() {
// calls the primary template, not the explicit specialization
// because `T` is `int[5]`, not `int *`
f(a);
// calls the function, not the template, because the function is an
// exact match too (pointer conversion isn't costly enough), and it's
// preferred.
g(a);
}
मेरा सुझाव है कि आप हमेशा उपयोग करने के लिए: एक और उदाहरण है जब संदर्भ शामिल कर रहे हैं, जिसकी वजह से शामिल (सापेक्ष आधार/व्युत्पन्न वर्ग रिश्ते और constness) प्रकार के सटीक मिलान के लिए देखने के लिए टेम्पलेट तर्क कटौती है ओवरलोडिंग, क्योंकि यह अमीर है (कुछ आंशिक विशेषज्ञता की अनुमति देता है), और इसके अलावा आप जो भी नेमस्पेस चाहते हैं उसमें फ़ंक्शन डाल सकते हैं (हालांकि तब यह कड़ाई से ओवरलोडिंग नहीं है)। उदाहरण के लिए, std::
नामस्थान में विशेषज्ञता रखने के बजाय, आप अपने swap
अधिभार को अपने नामस्थान में रख सकते हैं और इसे एडीएल द्वारा कॉल करने योग्य बना सकते हैं।
जो कुछ भी आप करते हैं, विशेषज्ञता को कभी भी मिश्रण नहीं करता है और अधिभारित करता है, यह this article अंक की तरह गड़बड़ का नरक होगा। स्टैंडर्ड इसके बारे में एक सुंदर पैरा है
समारोह टेम्पलेट्स, वर्ग टेम्पलेट्स, वर्ग टेम्पलेट्स के सदस्य काम करता है, वर्ग टेम्पलेट्स के स्थिर डेटा सदस्यों, वर्ग टेम्पलेट्स के सदस्य कक्षाएं, के सदस्य वर्ग टेम्पलेट्स के लिए स्पष्ट विशेषज्ञता घोषणाओं की नियुक्ति कक्षा टेम्पलेट्स, वर्ग टेम्पलेट्स के सदस्य फ़ंक्शन टेम्पलेट्स, वर्ग टेम्पलेट्स के सदस्य टेम्पलेट्स के सदस्य फ़ंक्शंस, गैर-टेम्पलेट कक्षाओं के सदस्य टेम्पलेट्स के सदस्य फ़ंक्शंस, क्लास टेम्पलेट्स के सदस्य वर्गों के सदस्य फ़ंक्शन टेम्पलेट्स, और आंशिक विशेषज्ञता घोषणाओं की नियुक्ति कक्षा टेम्पलेट्स, गैर-टेम्पलेट वर्गों के सदस्य वर्ग टेम्पलेट्स, वर्ग टेम्पलेट्स के सदस्य वर्ग टेम्पलेट इत्यादि, इस बात को प्रभावित कर सकते हैं कि स्पष्ट विशेषज्ञता घोषित करने की सापेक्ष स्थिति के अनुसार कोई कार्यक्रम अच्छी तरह से गठित किया गया है या नहीं ऊपर और नीचे निर्दिष्ट अनुवाद इकाई में arations और तत्कालता के उनके अंक। विशेषज्ञता लिखते समय, इसके स्थान के बारे में सावधान रहें; या इसे संकलित करने के लिए इस तरह के एक परीक्षण होगा कि अपने आत्म-विसर्जन को जलाने के लिए।
मैंने सवाल उठाया क्योंकि यह सी ++ (कम से कम मेरे लिए) में अंधेरे क्षेत्रों में से एक है! – AraK
आप विशेष रूप से क्या पूछते हैं? बस कुछ अंतर, या कुछ मामलों में जहां खतरे की जगह है? उदाहरण के लिए, निश्चित रूप से 'inc <> (10);' इन दो स्निपेट के लिए अलग व्यवहार करता है - लेकिन क्या आप यह सुनना चाहते हैं? –