दिलचस्प पोस्ट
कर्ल से जेसन प्रतिक्रिया को पार्स करने के लिए ASP.NET MVC और AngularJS रूटिंग का उपयोग कैसे करें? फैंसीबॉक्स लिंक लाइटबॉक्स में नहीं दिखता – मैं क्या याद कर रहा हूं? जब वर्तमान चयनित आइटम को फिर से चुना जाता है तो मैं एंड्रॉइड स्पिनर में एक ईवेंट कैसे प्राप्त करूं? सीएसएस के साथ पाठ नोड का चयन करें 'आयात मॉड्यूल' या 'मॉड्यूल आयात से' घोषित करने वाले संकेतक; प्रकार और नाम के बीच अंतरिक्ष के बाईं या दाईं तरफ तारांकन? एंड्रॉइड / जावा में JSON अर्रे चलना स्विफ्ट: प्रिंट () बनाम प्रिंट्लएन () बनाम एनएसएलॉग () Uncaught TypeError: अनिर्धारित jquery-min.js को लोड करने पर कोई फ़ंक्शन नहीं है जावा में आकार n के सेट से कश्मीर तत्वों को कमजोर करने के लिए कैसे करें? सी # का उपयोग करते हुए वर्षों में अंतर अंतर जावास्क्रिप्ट हैश मूल्य के साथ पृष्ठ पुनः लोड दृश्य नियंत्रक में प्रोग्राम को मैं कैसे बदल सकता हूँ? (एक्सकोड, आईफोन) जावास्क्रिप्ट नियमित अभिव्यक्ति में मिलान वाले समूहों को आप कैसे प्राप्त कर सकते हैं?

टेम्पलेट स्पेशलाइजेशन वीएस फ़ंक्शन ओवरलोडिंग

एक पाठ्यपुस्तक में मैंने नोट किया है कि आप फ़ंक्शन ओवरलोडिंग के लिए टेम्पलेट विशेषज्ञता के माध्यम से swap(x,y) जैसे मानक पुस्तकालय कार्यों के लिए अपना स्वयं का कार्यान्वयन प्रदान कर सकते हैं। यह ऐसे किसी भी प्रकार के लिए उपयोगी होगा जो असाइनमेंट स्वैप के अलावा किसी अन्य चीज़ से लाभ उठा सकते हैं, जैसे कि STL containers उदाहरण के लिए (जो पहले से ही स्वैप लिखे गए हैं, मुझे पता है)।

मेरे प्रश्न हैं:

  1. क्या बेहतर है: अपने विशिष्ट स्वैप कार्यान्वयन देने के लिए टेम्प्लेट स्पेशलाइज़ेशन, या टेम्पलेट के बिना सटीक पैरामीटर प्रदान करने के लिए ओवरलोडिंग फ़ंक्शन देना?

  2. क्यों यह बेहतर है? या यदि वे समान हैं, तो यह क्यों है?

वेब के समाधान से एकत्रित समाधान "टेम्पलेट स्पेशलाइजेशन वीएस फ़ंक्शन ओवरलोडिंग"

लघु कथा: अधिभार जब आप कर सकते हैं, तब जब आप की आवश्यकता होती है विशेषज्ञ।

लंबी कहानी: सी ++ विशेषताओं और अधिभार बहुत अलग तरीके से करता है। यह एक उदाहरण के साथ सबसे अच्छा समझाया गया है।

 template <typename T> void foo(T); template <typename T> void foo(T*); // overload of foo(T) template <> void foo<int>(int*); // specialisation of foo(T*) foo(new int); // calls foo<int>(int*); 

अब चलिए पिछले दो को स्वैप करें।

 template <typename T> void foo(T); template <> void foo<int*>(int*); // specialisation of foo(T) template <typename T> void foo(T*); // overload of foo(T) foo(new int); // calls foo(T*) !!! 

कंपाइलर ओवरलोड रिज़ॉल्यूशन से पहले भी विशेषज्ञताओं को देखता है। इसलिए, दोनों मामलों में, ओवरलोड संकल्प foo(T*) चुनता है। हालांकि, केवल पहले मामले में ही इसे foo<int*>(int*) क्योंकि दूसरे मामले में int* स्पेशलाइजेशन foo(T) की विशेषज्ञता है, foo(T*)


आपने std::swap उल्लेख किया है इससे चीजें और भी जटिल हो जाती हैं

मानक कहते हैं कि आप std नेमस्पेस में std को जोड़ सकते हैं। बढ़िया है, इसलिए आपके पास कुछ Foo प्रकार हैं और इसमें एक प्राप्य स्वैप है, तो आप std नेमस्पेस में swap(Foo&, Foo&) का विशेषज्ञ करते हैं। कोई समस्या नहीं।

लेकिन क्या होगा अगर Foo एक टेम्प्लेट क्लास है? सी ++ में फ़ंक्शन का आंशिक विशेषज्ञता नहीं है, इसलिए आप swap विशेषज्ञ नहीं कर सकते। आपका एकमात्र विकल्प ओवरलोड हो रहा है, लेकिन मानक कहते हैं कि आपको अतिरिक्त भार जोड़ने के लिए std namespace में अनुमति नहीं है!

इस बिंदु पर आपके पास दो विकल्प हैं:

  1. अपने स्वयं के नामस्थान में एक swap(Foo<T>&, Foo<T>&) फ़ंक्शन बनाएं, और आशा करें कि यह एडीएल के माध्यम से मिलेगा। मैं "आशा" कहता हूं क्योंकि अगर मानक पुस्तकालय std::swap(a, b); तरह std::swap(a, b); तब एडीएल बस काम नहीं करेगा

  2. मानक के उस भाग पर ध्यान न दें जो कहते हैं कि अधिभार जोड़ने और इसे वैसे भी नहीं करना है। ईमानदारी से, भले ही इसे तकनीकी रूप से अनुमति नहीं है, सभी यथार्थवादी परिदृश्यों में यह काम करने जा रहा है

हालांकि याद करने के लिए एक बात यह है कि इसमें कोई गारंटी नहीं है कि मानक लाइब्रेरी सभी पर swap का उपयोग करती है। अधिकांश एल्गोरिदम std::iter_swap उपयोग करते हैं और कुछ ऐसे लागूकरण में जो मैंने देखा है, यह हमेशा std::swap लिए आगे नहीं करता है।

पीटर अलेक्जेंडर के उत्तर में जोड़ने के लिए बहुत कम है मुझे सिर्फ एक प्रयोग का उल्लेख करना चाहिए जो फ़ंक्शन विशेषकरण ओवरलोडिंग पर अधिलेखित हो सकता है: यदि आपको कोई पैरामीटर नहीं है, तो फ़ंक्शन के बीच चयन करना होगा

उदाहरण के लिए

 template<class T> T zero(); template<> int zero() { return 0; } template<> long zero() { return 0L; } 

फ़ंक्शन ओवरलोडिंग का उपयोग करने के लिए ऐसा कुछ करने के लिए, आपको फ़ंक्शन हस्ताक्षर में एक पैरामीटर जोड़ना होगा:

 int zero(int) { return 0; } long zero(long) { return 0L; } 

आपको std नेमस्पेस में कार्यों को ओवरलोड करने की अनुमति नहीं है, लेकिन आपको टेम्प्लेट के विशेषज्ञ होने की अनुमति है (मुझे याद है), ताकि एक विकल्प हो।

दूसरा विकल्प एक ही नेमस्पेस में अपना swap फ़ंक्शन डाल रहा है जैसा कि वह काम कर रहा है और using std::swap; अयोग्य स्वैप को कॉल करने से पहले