टेम्प्लेट क्लास और क्लास टेम्प्लेट में क्या अंतर है?


जवाबों:


125

यह कई के लिए भ्रम की स्थिति है (विकिपीडिया पर जेनेरिक प्रोग्रामिंग पृष्ठ, कुछ C ++ ट्यूटोरियल और इस पृष्ठ पर अन्य उत्तर सहित)। जहां तक ​​C ++ का सवाल है, "टेम्पलेट क्लास" जैसी कोई चीज नहीं है, केवल "क्लास टेम्पलेट" है। उस वाक्यांश को पढ़ने का तरीका "फ़ंक्शन के लिए टेम्पलेट" है, जैसा कि "फ़ंक्शन टेम्पलेट" के विपरीत है, जो "फ़ंक्शन के लिए टेम्पलेट" है। फिर से: कक्षाएं टेम्पलेट्स को परिभाषित नहीं करती हैं, टेम्पलेट कक्षाओं (और कार्यों) को परिभाषित करते हैं । उदाहरण के लिए, यह एक खाका है , विशेष रूप से एक वर्ग का खाका , लेकिन यह एक वर्ग नहीं है :

template<typename T> class MyClassTemplate
{ 
    ...
};

घोषणा MyClassTemplate<int> एक वर्ग है, या पैदल, एक टेम्पलेट के आधार पर एक वर्ग है। टेम्पलेट के आधार पर वर्ग के कोई विशेष गुण नहीं हैं। वर्ग के आधार पर नहीं। विशेष गुण टेम्पलेट के ही हैं

वाक्यांश "टेम्पलेट क्लास" का अर्थ कुछ भी नहीं है, क्योंकि "टेम्पलेट" शब्द का विशेषण के रूप में कोई अर्थ नहीं है जब संज्ञा "वर्ग" पर लागू होता है जहां तक ​​सी ++ का संबंध है। यह एक के अस्तित्व का तात्पर्य वर्ग कि है (या परिभाषित करता है) एक टेम्पलेट है, जो एक अवधारणा है कि सी ++ में मौजूद नहीं है।

मैं सामान्य भ्रम को समझता हूं, क्योंकि यह संभवतः इस तथ्य पर आधारित है कि शब्द वास्तविक भाषा में "टेम्पलेट क्लास" क्रम में दिखाई देते हैं, जो कि एक पूरी कहानी है।


+1। कभी-कभी किसी वर्ग के "मूल" को अलग करने के लिए जो भी कारण हो, उसके लिए यह उपयोगी होता है, जिस स्थिति में आप "टेम्पलेट वर्ग" शब्द का यथोचित उपयोग कर सकते हैं - लेकिन आपके द्वारा दिए गए कारणों के लिए, यह ध्यान से परिभाषित करने के लिए एक अच्छा विचार है कि आप इससे क्या मतलब रखते हैं ।
j_random_hacker

1
@j_random_hacker - नीचे दिए गए litb का उत्तर देखें, लेकिन संक्षेप में, उसके लिए पसंदीदा शब्द "वर्ग टेम्पलेट विशेषज्ञता" है
निश्चित नहीं

@ नॉट श्योर: वास्तव में मुझे "क्लास टेम्प्लेट स्पेशलाइजेशन" थोड़ा अस्पष्ट लगता है, क्योंकि यह एक टेम्प्लेट के लिए एक स्पष्ट या आंशिक विशेषज्ञता को परिभाषित करने की प्रक्रिया को भी संदर्भित कर सकता है - कुछ ऐसा जो "वास्तविक" क्लास बनाने के लिए आवश्यक नहीं है। :) IMHO "वर्ग टेम्पलेट तात्कालिकता" सबसे स्पष्ट शब्द है।
j_random_hacker

2
@j_random_hacker: इसके लिए एक उचित शब्द है - "स्पष्ट वर्ग टेम्पलेट विशेषज्ञता" और "आंशिक स्पष्ट टेम्पलेट टेम्पलेट विशेषज्ञता।" बोझिल, लेकिन अस्पष्ट नहीं :)
निश्चित

1
−1 शर्तों का अर्थ है कि वे शर्तों का उपयोग करने वाले लोगों से क्या मतलब रखते हैं। शाब्दिक अर्थों का विश्लेषण करना शुरू करना अर्थहीन है। बस इसे दैनिक जीवन या इंजीनियरिंग के किसी अन्य शब्द के साथ आज़माएं। संक्षेप में, यह उत्तर हॉगवॉश है। एसएचएच का जवाब , बज्ने को उद्धृत करना ठीक है।
चीयर्स एंड हीथ। - अल्फ

13

C ++ के निर्माता, Bjarne Stroustrup ने अपनी पुस्तक द C ++ प्रोग्रामिंग लैंग्वेज 4th संस्करण में 23.2.1 डिफाइनिंग अ टेम्प्लेट में कहा है:

ऐसे लोग हैं जो शब्द वर्ग टेम्पलेट और टेम्पलेट वर्ग के बीच शब्दार्थ भेद बनाते हैं । मैं नही; यह बहुत सूक्ष्म होगा: कृपया उन शर्तों को विनिमेय मानें। इसी तरह, मैं फंक्शन टेम्पलेट को टेंपरेचर फंक्शन के साथ बदलने योग्य मानता हूं ।


12

अंतर यह है कि "टेम्पलेट वर्ग" शब्द सी ++ मानक में मौजूद नहीं है। यह ज्यादातर लोगों द्वारा इस्तेमाल किया जाने वाला एक शब्द है जो यह सोचते हैं कि "क्लास टेम्पलेट" शब्द भ्रमित करने वाला है (जैसे कि क्यूटी कंपनियों नोकिया और पूर्व में ट्रिटेक)।

मानक के पास इसकी कोई अवधारणा नहीं है, इसलिए यह अन्य लोगों के लिए एक अंतर है। कुछ लोग इसे समान रूप से उपयोग करते हैं, और अन्य कहते हैं कि "टेम्पलेट वर्ग" शब्द तात्कालिक या स्पष्ट रूप से विशिष्ट वर्ग टेम्पलेट को संदर्भित करता है, जो इसे "वर्ग टेम्पलेट विशेषज्ञता" शब्द के समतुल्य बना देगा। ऐतिहासिक रूप से, इसका यह अर्थ था। एनोटेट संदर्भ मैनुअल पेज 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; };
  • एआरएम ने कक्षा (2), और (4) और (5) एक टेम्पलेट वर्ग द्वारा उत्पन्न वर्ग को बुलाया । मुझे यकीन नहीं है कि एआरएम पहले से ही आंशिक विशेषज्ञता के बारे में जानता था। लेकिन अगर ऐसा है (3) को टेम्पलेट क्लास नहीं कहा जाता है, क्योंकि (3) एक क्लास को परिभाषित नहीं करता है, लेकिन एक टेम्पलेट को परिभाषित करता है।
  • वर्तमान मानक कॉल वर्ग (2), और (4) और (5) वर्ग टेम्पलेट विशेषज्ञता द्वारा उत्पन्न वाले हैं । और (3) एक आंशिक विशेषज्ञता के रूप में कहा जाता है , एक स्पष्ट विशेषज्ञता के विपरीत । यह कभी-कभी कॉल (3) एक विशेषज्ञता (3.2 / 5 - हालांकि क्रॉस-लिंक को स्पष्ट करने के साथ), हालांकि मुझे लगता है कि यह मेरे लिए पूरी तरह से स्पष्ट नहीं है, क्योंकि यह एक "विशेषज्ञता" को "वर्ग, फ़ंक्शन या वर्ग के रूप में परिभाषित करता है। सदस्य ", जो (3) संतुष्ट नहीं करता है।

3
हेहे। हाँ और कई अन्य लोग अभी भी उस सेट में योगदान करते हैं। विशेष रूप से C ++ Faq लाइट, और Qt प्रलेखन। Faq लाइट के लेखक ने मुझे एक मेल में बताया कि वह एक और FAQ आइटम रखना चाहता है जिसमें बताया गया है कि "विशेषज्ञता" शब्द का उपयोग करना बेहतर है क्योंकि यह कम भ्रम का कारण बनता है (उपयोगकर्ता द्वारा लिखे गए विशेषज्ञता के लिए "स्पष्ट विशेषज्ञता" का उपयोग करना) फिर)। क्यूटी लोगों ने मुझे बताया कि वे "क्लास टेम्पलेट" शब्द का उपयोग नहीं करना चाहते हैं .... वे इसे "अप्राकृतिक" भी पाते हैं। बहुत बुरा।
जोहान्स स्काउब -

@ जोहान्सचैब-लिटब: एआरएम बज़्ने स्ट्रॉस्ट्रुप और मार्गरेट एलिस द्वारा लिखा गया था, मोटे तौर पर 1991 IIRC। एआरएम से आपका उद्धरण ब्रज के टीसीपीपीएल 4 वें संस्करण से एसएचएच के उद्धरण का खंडन करता है । इसलिए यह अच्छा है कि आप पुराने (पूर्व-मानक) और वर्तमान शब्दावली के बीच अंतर करें।
चीयर्स एंड हीथ। - अल्फ


1

एक क्लास टेम्प्लेट एक ऐसा टेम्प्लेट होता है, जिसका इस्तेमाल क्लासेस जेनरेट करने के लिए किया जाता है, जबकि एक टेम्प्लेट क्लास एक ऐसी क्लास होती है, जो टेम्प्लेट द्वारा निर्मित होती है।


0

टेम्प्लेट क्लास: एक ऐसी क्लास जिसमें जेनेरिक डेफिनिशन या एक ऐसा पैरामीटर होता है, जो क्लाइंट द्वारा जानकारी प्रदान किए जाने तक तत्काल नहीं होती है। यह उपसर्ग टेम्पलेट और टी के उपयोग के साथ सादे टेम्पलेट्स के लिए एक शब्दजाल के लिए कहा जाता है। क्लास टेम्प्लेट: एक क्लास के व्यक्तिगत निर्माण को एक क्लास टेम्प्लेट द्वारा निर्दिष्ट किया जाता है जो लगभग उसी तरह होता है जैसे किसी क्लास का उपयोग करके व्यक्तिगत ऑब्जेक्ट का निर्माण किया जाता है। इसे टेम्प्लेट क्लास Ex- Classname objectname (तर्क सूची) के ऑब्जेक्ट के लिए संदर्भित किया जाता है


0

क्लास टेम्पलेट विभिन्न प्रकार की वस्तुओं के लिए एक सामान्य वर्ग है। मूल रूप से यह मापदंडों के आधार पर कक्षाएं उत्पन्न करने के लिए एक विनिर्देश प्रदान करता है। जब भी कोई नई वस्तु बनाई जाती है तो उस उद्देश्य के लिए एक नया वर्ग स्मृति में जगह लेगा। इसे क्लास टेम्पलेट को तत्काल करना कहा जाता है और क्लास के प्रत्येक इंस्टेंटिएटेड संस्करण को टेम्पलेट क्लास कहा जाता है।


0

इस पेपर पर नज़र डालें (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आपके द्वारा वर्णित कक्षा के बारे में : मुझे इस बात की जानकारी नहीं थी कि इस तरह के सदस्य-फ़ंक्शन-टेम्पलेट को निषिद्ध किया गया था। यह मेरे द्वारा आजमाए गए सभी संकलकों द्वारा स्वीकार किया जाता है। मैं क्या खो रहा हूँ?
dan_din_pantelimon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.