C++ में Generics: टेम्पलेट क्या हैं और शुरुआती उनका उपयोग कैसे करें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C++ में Generics: क्यों ज़रूरी हैं और कैसे उपयोग करें



नमस्ते दोस्त! यदि आपने अभी-अभी C++ सीखना शुरू किया है और पहले से ही Generics (या टेम्पलेट) जैसी अवधारणा का सामना किया है, तो यह लेख आपके लिए है। कई शुरुआती टेम्पलेट से डरते हैं, उन्हें कुछ जटिल और जादुई मानते हैं। वास्तव में, सब कुछ बहुत सरल है। आइए समझते हैं कि यह क्या है, इसकी आवश्यकता क्यों है और व्यवहार में इसका उपयोग कैसे करें।



C++ में Generics (टेम्पलेट) क्या हैं?



कल्पना करें कि आपको एक फ़ंक्शन लिखना है जो दो संख्याओं को जोड़ता है। आप int के लिए एक फ़ंक्शन, double के लिए दूसरा, float के लिए तीसरा लिखते हैं… मान लीजिए, यह थकाऊ है और DRY (Don't Repeat Yourself) सिद्धांत का उल्लंघन करता है।



यहाँ टेम्पलेट (templates) मदद करते हैं। यह एक तंत्र है जो आपको सामान्यीकृत कोड लिखने की अनुमति देता है जो किसी भी डेटा प्रकार के साथ काम करता है। C++ में, यह वही है जिसे अन्य भाषाओं में Generics कहा जाता है (उदाहरण के लिए, Java या C# में)।



टेम्पलेट कोई विशिष्ट फ़ंक्शन या क्लास नहीं है, बल्कि एक "ब्लूप्रिंट" या "रेसिपी" है। कंपाइलर, यह देखकर कि आप int प्रकार के साथ टेम्पलेट का उपयोग कर रहे हैं, int के लिए कोड का एक संस्करण बनाता है। यदि आप इसे double के साथ उपयोग करते हैं, तो कंपाइलर double के लिए एक संस्करण बनाता है। इसे टेम्पलेट इंस्टेंशिएशन कहा जाता है।



टेम्पलेट क्यों ज़रूरी हैं? तीन मुख्य कारण



1. कोड का पुन: उपयोग

विभिन्न प्रकार की संख्याओं के लिए 10 फ़ंक्शन लिखने के बजाय, आप एक सार्वभौमिक फ़ंक्शन लिखते हैं। इससे समय बचता है, त्रुटियों की संख्या कम होती है और कोड अधिक पठनीय बनता है।



2. प्रकार सुरक्षा

मैक्रोज़ (#define) या void* के उपयोग के विपरीत, टेम्पलेट कंपाइलर द्वारा जाँचे जाते हैं। यदि आप टेम्पलेट में कोई अनुपयुक्त प्रकार पास करने का प्रयास करते हैं, तो कंपाइलर प्रोग्राम निष्पादन के दौरान नहीं, बल्कि बिल्ड चरण के दौरान एक त्रुटि देगा।



3. प्रदर्शन

टेम्पलेट रनटाइम के दौरान कोई ओवरहेड नहीं जोड़ते। कंपाइलर प्रत्येक विशिष्ट प्रकार के लिए अनुकूलित कोड बनाता है, और यह कोड उतनी ही तेज़ी से काम करता है जितना कि आपने इसे मैन्युअल रूप से लिखा होता।



टेम्पलेट का उपयोग कैसे करें: सिंटैक्स और उदाहरण



आइए दो मुख्य प्रकार के टेम्पलेट देखें: फ़ंक्शन टेम्पलेट और क्लास टेम्पलेट।



फ़ंक्शन टेम्पलेट

सबसे सरल उदाहरण एक फ़ंक्शन है जो दो मानों में से अधिकतम ज्ञात करता है।



#include <iostream>#include <string>

// फ़ंक्शन टेम्पलेट घोषित करनाtemplate <typename T>T max_value(T a, T b) { return (a > b) ? a : b;}

int main() { // int के साथ काम करता है std::cout << max_value(10, 20) << std::endl; // आउटपुट: 20 // double के साथ काम करता है std::cout << max_value(3.14, 2.71) << std::endl; // आउटपुट: 3.14 // स्ट्रिंग के साथ काम करता है std::cout << max_value(std::string("apple"), std::string("banana")) << std::endl; // आउटपुट: banana return 0;}


कीवर्ड template कंपाइलर को बताता है: "ध्यान दें, आगे एक टेम्पलेट है"। <typename T> टेम्पलेट पैरामीटर की सूची है। T प्रकार का एक सशर्त नाम है जिसे फ़ंक्शन को कॉल करने पर वास्तविक प्रकार से बदल दिया जाएगा। typename के बजाय class का उपयोग किया जा सकता है — कोई अंतर नहीं है।



महत्वपूर्ण: कंपाइलर पास किए गए आर्गुमेंट के आधार पर स्वयं अनुमान लगाता है कि आपका क्या मतलब है। इसे टेम्पलेट आर्गुमेंट डिडक्शन कहा जाता है। लेकिन आप प्रकार स्पष्ट रूप से निर्दिष्ट कर सकते हैं:



std::cout << max_value<double>(10, 20.5) << std::endl; // स्पष्ट रूप से double प्रकार निर्दिष्ट करना


क्लास टेम्पलेट

क्लास टेम्पलेट आपको सार्वभौमिक डेटा कंटेनर बनाने की अनुमति देते हैं। एक क्लासिक उदाहरण std::pair का एक सरल एनालॉग है।



#include <iostream>#include <string>

// टेम्पलेट

ब्लॉग

पुस्तक अनुशंसाएँ