टेम्प्लेट क्लास और क्लास टेम्प्लेट में क्या अंतर है?
टेम्प्लेट क्लास और क्लास टेम्प्लेट में क्या अंतर है?
जवाबों:
यह कई के लिए भ्रम की स्थिति है (विकिपीडिया पर जेनेरिक प्रोग्रामिंग पृष्ठ, कुछ C ++ ट्यूटोरियल और इस पृष्ठ पर अन्य उत्तर सहित)। जहां तक C ++ का सवाल है, "टेम्पलेट क्लास" जैसी कोई चीज नहीं है, केवल "क्लास टेम्पलेट" है। उस वाक्यांश को पढ़ने का तरीका "फ़ंक्शन के लिए टेम्पलेट" है, जैसा कि "फ़ंक्शन टेम्पलेट" के विपरीत है, जो "फ़ंक्शन के लिए टेम्पलेट" है। फिर से: कक्षाएं टेम्पलेट्स को परिभाषित नहीं करती हैं, टेम्पलेट कक्षाओं (और कार्यों) को परिभाषित करते हैं । उदाहरण के लिए, यह एक खाका है , विशेष रूप से एक वर्ग का खाका , लेकिन यह एक वर्ग नहीं है :
template<typename T> class MyClassTemplate
{
...
};
घोषणा MyClassTemplate<int> एक वर्ग है, या पैदल, एक टेम्पलेट के आधार पर एक वर्ग है। टेम्पलेट के आधार पर वर्ग के कोई विशेष गुण नहीं हैं। वर्ग के आधार पर नहीं। विशेष गुण टेम्पलेट के ही हैं ।
वाक्यांश "टेम्पलेट क्लास" का अर्थ कुछ भी नहीं है, क्योंकि "टेम्पलेट" शब्द का विशेषण के रूप में कोई अर्थ नहीं है जब संज्ञा "वर्ग" पर लागू होता है जहां तक सी ++ का संबंध है। यह एक के अस्तित्व का तात्पर्य वर्ग कि है (या परिभाषित करता है) एक टेम्पलेट है, जो एक अवधारणा है कि सी ++ में मौजूद नहीं है।
मैं सामान्य भ्रम को समझता हूं, क्योंकि यह संभवतः इस तथ्य पर आधारित है कि शब्द वास्तविक भाषा में "टेम्पलेट क्लास" क्रम में दिखाई देते हैं, जो कि एक पूरी कहानी है।
C ++ के निर्माता, Bjarne Stroustrup ने अपनी पुस्तक द C ++ प्रोग्रामिंग लैंग्वेज 4th संस्करण में 23.2.1 डिफाइनिंग अ टेम्प्लेट में कहा है:
ऐसे लोग हैं जो शब्द वर्ग टेम्पलेट और टेम्पलेट वर्ग के बीच शब्दार्थ भेद बनाते हैं । मैं नही; यह बहुत सूक्ष्म होगा: कृपया उन शर्तों को विनिमेय मानें। इसी तरह, मैं फंक्शन टेम्पलेट को टेंपरेचर फंक्शन के साथ बदलने योग्य मानता हूं ।
अंतर यह है कि "टेम्पलेट वर्ग" शब्द सी ++ मानक में मौजूद नहीं है। यह ज्यादातर लोगों द्वारा इस्तेमाल किया जाने वाला एक शब्द है जो यह सोचते हैं कि "क्लास टेम्पलेट" शब्द भ्रमित करने वाला है (जैसे कि क्यूटी कंपनियों नोकिया और पूर्व में ट्रिटेक)।
मानक के पास इसकी कोई अवधारणा नहीं है, इसलिए यह अन्य लोगों के लिए एक अंतर है। कुछ लोग इसे समान रूप से उपयोग करते हैं, और अन्य कहते हैं कि "टेम्पलेट वर्ग" शब्द तात्कालिक या स्पष्ट रूप से विशिष्ट वर्ग टेम्पलेट को संदर्भित करता है, जो इसे "वर्ग टेम्पलेट विशेषज्ञता" शब्द के समतुल्य बना देगा। ऐतिहासिक रूप से, इसका यह अर्थ था। एनोटेट संदर्भ मैनुअल पेज 343 पर परिभाषित करता है
एक वर्ग टेम्पलेट से उत्पन्न एक वर्ग, एक टेम्पलेट वर्ग कहा जाता है के रूप में एक वर्ग विशेष रूप से एक साथ परिभाषित किया गया है टेम्पलेट-वर्ग-नाम अपने नाम के रूप में
गैर-टर्मिनल टेम्पलेट-क्लास-नाम आज के मानक में उपयोग किए जाने वाले गैर-टर्मिनल टेम्पलेट-आईडी के बराबर है और नीचे आता है template-name < arguments >।
आज के शब्दों से परिचित होने के लिए, जो संदिग्ध पुरानी शर्तों का उपयोग करने से अधिक महत्वपूर्ण है
// (1) defines a class template
template<typename T> class A { };
// (2) defines a class template explicit specialization
template<> class A<int> { };
// (3) defines a class template partial specialization
template<typename T> class A<T*> { };
// (4) explicitly instantiates A<char>.
template class A<char>;
// (5) implicitly instantiates A<short> (because of the member declaration)
struct D { A<short> a; };
एक टेम्पलेट वर्ग टेम्पलेट विधि डिजाइन पैटर्न से संबंधित है , जबकि क्लास टेम्पलेट सिर्फ एक "फिल-इन-द-ब्लॉक्स" क्लास टेम्पलेट है।
एक क्लास टेम्प्लेट एक ऐसा टेम्प्लेट होता है, जिसका इस्तेमाल क्लासेस जेनरेट करने के लिए किया जाता है, जबकि एक टेम्प्लेट क्लास एक ऐसी क्लास होती है, जो टेम्प्लेट द्वारा निर्मित होती है।
टेम्प्लेट क्लास: एक ऐसी क्लास जिसमें जेनेरिक डेफिनिशन या एक ऐसा पैरामीटर होता है, जो क्लाइंट द्वारा जानकारी प्रदान किए जाने तक तत्काल नहीं होती है। यह उपसर्ग टेम्पलेट और टी के उपयोग के साथ सादे टेम्पलेट्स के लिए एक शब्दजाल के लिए कहा जाता है। क्लास टेम्प्लेट: एक क्लास के व्यक्तिगत निर्माण को एक क्लास टेम्प्लेट द्वारा निर्दिष्ट किया जाता है जो लगभग उसी तरह होता है जैसे किसी क्लास का उपयोग करके व्यक्तिगत ऑब्जेक्ट का निर्माण किया जाता है। इसे टेम्प्लेट क्लास Ex- Classname objectname (तर्क सूची) के ऑब्जेक्ट के लिए संदर्भित किया जाता है
क्लास टेम्पलेट विभिन्न प्रकार की वस्तुओं के लिए एक सामान्य वर्ग है। मूल रूप से यह मापदंडों के आधार पर कक्षाएं उत्पन्न करने के लिए एक विनिर्देश प्रदान करता है। जब भी कोई नई वस्तु बनाई जाती है तो उस उद्देश्य के लिए एक नया वर्ग स्मृति में जगह लेगा। इसे क्लास टेम्पलेट को तत्काल करना कहा जाता है और क्लास के प्रत्येक इंस्टेंटिएटेड संस्करण को टेम्पलेट क्लास कहा जाता है।
इस पेपर पर नज़र डालें (wg21 से और 1992 में प्रकाशित हुआ था) :
लगातार शब्दावली
बहुत से तर्क और असहमति आज तक, अध्याय में वर्णित शब्दावली के संबंध में टेम्प्लेट का उपयोग करते हैं। अधिकांश अक्सर अलग - अलग विचारों और इरादों को व्यक्त करने के लिए 'फंक्शन-टेम्प्लेट' और 'टेम्प्लेट-फंक्शन' के अलग - अलग अनुप्रयोग होते हैं । चूंकि कोई सुसंगत नामकरण लागू नहीं होता है, इसलिए परिणाम भ्रम और तर्क है।
इस दस्तावेज के प्रयोजनों के लिए, समिति द्वारा औपचारिक रूप से अपनाने के लिए प्रस्तावों के बारे में विचार-विमर्श के लिए, और प्रलेखन को स्पष्ट करने के प्रयोजनों के लिए; मैं प्रस्ताव करता हूं कि हम औपचारिकता अपनाएं, कि एक अनुगामी '-template' एक टेम्पलेट द्वारा वर्णित प्रकारों या कार्यों के एक सेट का वर्णन करता है। और यह कि एक प्रमुख 'टेम्पलेट-' , का उपयोग '-ememplate' के भाग की टेम्पलेट परिभाषा का वर्णन करने के लिए किया जाता है , जैसे कि
'template-member-function'। इस प्रकार: -
- 'फंक्शन-टेम्प्लेट': टेम्प्लेट द्वारा वर्णित कार्यों का एक सेट, कुछ प्रकार की जानकारी पर पैरामीट्रिक उस टेम्प्लेट के तर्क के रूप में प्रदान किया जाता है। उदाहरण के लिए :-
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
- 'क्लास-टेम्प्लेट': एक टेम्प्लेट द्वारा वर्णित कक्षाओं का एक सेट, कुछ प्रकार की जानकारी पर पैरामीट्रिक उस टेम्पलेट के तर्क के रूप में प्रदान किया जाता है। उदाहरण के लिए :-
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
- 'टेम्प्लेट-फंक्शन': इस शब्द की अब अनुमति नहीं है। **
'टेम्प्लेट-क्लास': इस शब्द की अनुमति नहीं है। "
'सदस्य-फ़ंक्शन-टेम्प्लेट': इस शब्द की अनुमति नहीं है, क्योंकि यह एक ऐसी संपत्ति का वर्णन करता है जो वर्तमान में टेम्पलेट परिभाषा द्वारा समर्थित नहीं है। उपरोक्त शब्दावली सम्मेलन का उपयोग करना, यह एक गैर-वर्ग-टेम्पलेट के एक सदस्य का वर्णन करेगा, जिसकी परिभाषा स्वयं एक टेम्पलेट थी। उदाहरण के लिए :-
class Normal { public:
template<class T> int foo(T*pT)
{ return ( pT == 0 ); }
};
हालाँकि, चूंकि वर्तमान में टेम्पलेट वैश्विक दायरे तक सीमित हैं, इसलिए ऐसा टेम्पलेट अमान्य है।
- 'टेम्पलेट स्थैतिक सदस्यीय-समारोह':
- 'टेम्पलेट सदस्यीय-समारोह':
- 'टेम्पलेट स्थैतिक सदस्यीय':
- 'टेम्प्लेट-स्टैटिक-डेटा-मेंबर ' टेम्प्लेट-मेंबर ': किसी सदस्य की परिभाषा के लिए वैकल्पिक शब्द' क्लास-टेम्प्लेट 'से अलग होता है, जिसके अंतर्गत वह आता है। उदाहरण के लिए :-
template<class T> int S<T>::sep_member()
{ return i; }
Normalआपके द्वारा वर्णित कक्षा के बारे में : मुझे इस बात की जानकारी नहीं थी कि इस तरह के सदस्य-फ़ंक्शन-टेम्पलेट को निषिद्ध किया गया था। यह मेरे द्वारा आजमाए गए सभी संकलकों द्वारा स्वीकार किया जाता है। मैं क्या खो रहा हूँ?