इस लेख में, आप C ++ में टेम्पलेट्स के बारे में जानेंगे। आप सामान्य प्रोग्रामिंग के लिए टेम्पलेट्स की शक्ति का उपयोग करना सीखेंगे।
टेम्प्लेट C ++ की शक्तिशाली विशेषताएं हैं जो आपको जेनेरिक प्रोग्राम लिखने की अनुमति देती हैं। सरल शब्दों में, आप टेम्प्लेट का उपयोग करके विभिन्न डेटा प्रकारों के साथ काम करने के लिए एकल फ़ंक्शन या वर्ग बना सकते हैं।
कार्यक्रमों के कोड पुन: प्रयोज्य और लचीलेपन के उद्देश्य से टेम्प्लेट का उपयोग अक्सर बड़े कोडबेस में किया जाता है।
टेम्पलेट्स की अवधारणा को दो अलग-अलग तरीकों से इस्तेमाल किया जा सकता है:
- समारोह टेम्पलेट्स
- कक्षा के टेम्पलेट
समारोह टेम्पलेट्स
एक फंक्शन टेम्पलेट एक सामान्य फ़ंक्शन के समान होता है, जिसमें एक महत्वपूर्ण अंतर होता है।
एक एकल फ़ंक्शन टेम्प्लेट एक ही बार में विभिन्न डेटा प्रकारों के साथ काम कर सकता है, लेकिन एक एकल सामान्य फ़ंक्शन केवल डेटा प्रकारों के एक सेट के साथ काम कर सकता है।
आम तौर पर, यदि आपको दो या दो से अधिक प्रकार के डेटा पर समान संचालन करने की आवश्यकता होती है, तो आप आवश्यक फ़ंक्शन घोषणा के साथ दो फ़ंक्शन बनाने के लिए फ़ंक्शन ओवरलोडिंग का उपयोग करते हैं।
हालाँकि, फ़ंक्शन टेम्पलेट का उपयोग करने के लिए एक बेहतर तरीका होगा क्योंकि आप समान कार्य को कम और अनुरक्षण कोड लिख सकते हैं।
फ़ंक्शन टेम्पलेट कैसे घोषित करें?
कीवर्ड के साथ एक समारोह टेम्पलेट शुरू होता है टेम्पलेट टेम्पलेट पैरामीटर / एस के अंदर के बाद जो समारोह घोषणा के बाद आता है।
टेम्पलेट < वर्ग T> T someFunction (T arg) (…)
उपरोक्त कोड में, T एक टेम्पलेट तर्क है जो विभिन्न डेटा प्रकारों (int, float) को स्वीकार करता है, और वर्ग एक कीवर्ड है।
आप typename
उपरोक्त उदाहरण में वर्ग के बजाय कीवर्ड का भी उपयोग कर सकते हैं ।
जब, डेटा प्रकार का एक तर्क पास किया जाता है someFunction( )
, तो कंपाइलर someFunction()
दिए गए डेटा प्रकार के लिए एक नया संस्करण तैयार करता है ।
उदाहरण 1: सबसे बड़ी संख्या खोजने के लिए फंक्शन टेम्प्लेट
फ़ंक्शन टेम्प्लेट का उपयोग करके दो नंबरों के बीच सबसे बड़ा प्रदर्शन करने का कार्यक्रम।
// If two characters are passed to function template, character with larger ASCII value is displayed. #include using namespace std; // template function template T Large(T n1, T n2) ( return (n1> n2) ? n1 : n2; ) int main() ( int i1, i2; float f1, f2; char c1, c2; cout <> i1>> i2; cout << Large(i1, i2) <<" is larger." << endl; cout <> f1>> f2; cout << Large(f1, f2) <<" is larger." << endl; cout <> c1>> c2; cout << Large(c1, c2) << " has larger ASCII value."; return 0; )
आउटपुट
दो पूर्णांक दर्ज करें: 5 10 10 बड़ा है। दो फ़्लोटिंग-पॉइंट नंबर दर्ज करें: 12.4 10.2 12.4 बड़ा है। दो अक्षर दर्ज करें: z Z z का ASCII मान बड़ा है।
उपरोक्त कार्यक्रम में, एक फ़ंक्शन टेम्पलेट Large()
परिभाषित किया गया है जो डेटा प्रकार के दो तर्क n1 और n2 को स्वीकार करता है T
। T
यह दर्शाता है कि तर्क किसी भी डेटा प्रकार का हो सकता है।
Large()
फ़ंक्शन एक साधारण सशर्त ऑपरेशन का उपयोग करके दो तर्कों के बीच सबसे बड़ा रिटर्न देता है।
अंदर main()
समारोह, तीन अलग-अलग डेटा प्रकार के चर: int
, float
और char
घोषणा की जाती है। चर तब Large()
फ़ंक्शन टेम्पलेट में सामान्य फ़ंक्शन के रूप में पास किए जाते हैं ।
रन-टाइम के दौरान, जब एक पूर्णांक को टेम्प्लेट फ़ंक्शन में पास किया जाता है, तो कंपाइलर को पता होता है कि उसे Large()
इंटर्नल तर्कों को स्वीकार करने के लिए फ़ंक्शन उत्पन्न करना है और ऐसा करता है।
इसी प्रकार, जब फ़्लोटिंग-पॉइंट डेटा और चार डेटा पास होते हैं, तो यह तर्क डेटा प्रकारों को जानता है और Large()
तदनुसार कार्य उत्पन्न करता है।
इस तरह, केवल एक ही फ़ंक्शन टेम्प्लेट का उपयोग करके तीन समान सामान्य कार्यों को प्रतिस्थापित किया गया और आपके कोड को बनाए रखा गया।
उदाहरण 2: फंक्शन टेम्प्लेट्स का उपयोग करके डेटा स्वैप करें
फ़ंक्शन टेम्प्लेट का उपयोग करके डेटा स्वैप करने का कार्यक्रम।
#include using namespace std; template void Swap(T &n1, T &n2) ( T temp; temp = n1; n1 = n2; n2 = temp; ) int main() ( int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "Before passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "After passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; return 0; )
आउटपुट
फंक्शन टेम्प्लेट में डेटा पास करने से पहले। i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b डेटा को फंक्शन टेम्पलेट में पास करने के बाद। i1 = 2 i2 = 1 f1 = 2.2 f2 = 1.1 c1 = b c2 = a
इस कार्यक्रम में, मान पास करके किसी फ़ंक्शन को कॉल करने के बजाय, संदर्भ द्वारा कॉल जारी किया जाता है।
Swap()
समारोह टेम्पलेट संदर्भ द्वारा दो तर्क और उन्हें स्वैप लेता है।
कक्षा के टेम्पलेट
फ़ंक्शन टेम्प्लेट की तरह, आप जेनेरिक क्लास ऑपरेशंस के लिए क्लास टेम्प्लेट भी बना सकते हैं।
कभी-कभी, आपको एक वर्ग कार्यान्वयन की आवश्यकता होती है जो सभी वर्गों के लिए समान हो, केवल उपयोग किए गए डेटा प्रकार अलग-अलग हों।
आम तौर पर, आपको प्रत्येक डेटा प्रकार के लिए एक अलग वर्ग बनाने या एकल वर्ग के भीतर अलग-अलग सदस्य चर और फ़ंक्शन बनाने की आवश्यकता होगी।
यह अनावश्यक रूप से आपके कोड आधार को फूला देगा और इसे बनाए रखना कठिन होगा, क्योंकि एक परिवर्तन एक वर्ग / कार्य सभी वर्गों या कार्यों पर किया जाना चाहिए।
हालाँकि, क्लास टेम्प्लेट सभी डेटा प्रकारों के लिए समान कोड का पुन: उपयोग करना आसान बनाते हैं।
क्लास टेम्पलेट कैसे घोषित करें?
साँचा < class T> class className (… public: T var; t someOperation (T arg);…);
उपरोक्त घोषणा में, T
टेम्पलेट तर्क है जो उपयोग किए गए डेटा प्रकार के लिए एक प्लेसहोल्डर है।
वर्ग निकाय के अंदर, एक सदस्य चर संस्करण और एक सदस्य फ़ंक्शन someOperation()
दोनों प्रकार के होते हैं T
।
क्लास टेम्प्लेट ऑब्जेक्ट कैसे बनाएं?
क्लास टेम्प्लेट ऑब्जेक्ट बनाने के लिए, आपको एक निर्माण के दौरान डेटा प्रकार को परिभाषित करने की आवश्यकता होती है ।
className classObject;
उदाहरण के लिए:
className classObject; className classObject; className classObject;
Example 3: Simple calculator using Class template
Program to add, subtract, multiply and divide two numbers using class template
#include using namespace std; template class Calculator ( private: T num1, num2; public: Calculator(T n1, T n2) ( num1 = n1; num2 = n2; ) void displayResult() ( cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << divide() << endl; ) T add() ( return num1 + num2; ) T subtract() ( return num1 - num2; ) T multiply() ( return num1 * num2; ) T divide() ( return num1 / num2; ) ); int main() ( Calculator intCalc(2, 1); Calculator floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; )
Output
Int results: Numbers are: 2 and 1. Addition is: 3 Subtraction is: 1 Product is: 2 Division is: 2 Float results: Numbers are: 2.4 and 1.2. Addition is: 3.6 Subtraction is: 1.2 Product is: 2.88 Division is: 2
In the above program, a class template Calculator
is declared.
The class contains two private members of type T
: num1 & num2, and a constructor to initalize the members.
It also contains public member functions to calculate the addition, subtraction, multiplication and division of the numbers which return the value of data type defined by the user. Likewise, a function displayResult()
to display the final output to the screen.
In the main()
function, two different Calculator
objects intCalc
and floatCalc
are created for data types: int
and float
respectively. The values are initialized using the constructor.
Notice we use and
while creating the objects. These tell the compiler the data type used for the class creation.
This creates a class definition each for int
and float
, which are then used accordingly.
फिर, displayResult()
दोनों ऑब्जेक्ट्स को कहा जाता है जो कैलक्यूलेटर संचालन करता है और आउटपुट प्रदर्शित करता है।