टेम्पलेट्स जेनेरिक प्रोग्रामिंग की नींव हैं, जिसमें किसी विशेष प्रकार से स्वतंत्र तरीके से कोड लिखना शामिल है।
एक टेम्पलेट जेनेरिक क्लास या फ़ंक्शन बनाने के लिए एक ब्लूप्रिंट या फॉर्मूला है। लाइब्रेरी कंटेनर्स जैसे इटरेटर्स और एल्गोरिदम्स जेनेरिक प्रोग्रामिंग के उदाहरण हैं और टेम्पलेट अवधारणा का उपयोग करके विकसित किए गए हैं।
प्रत्येक कंटेनर की एक ही परिभाषा होती है, जैसे vector, लेकिन हम कई अलग-अलग प्रकार के वेक्टर्स परिभाषित कर सकते हैं, उदाहरण के लिए, vector<int> या vector<string>।
C++ टेम्पलेट उदाहरण
#include <iostream>
#include <string>
using namespace std;
template <typename T>
inline T const& Max(T const& a, T const& b) {
return a < b ? b : a;
}
int main() {
int i = 39, j = 20;
cout << "Max(i, j): " << Max(i, j) << endl;
double f1 = 13.5, f2 = 20.7;
cout << "Max(f1, f2): " << Max(f1, f2) << endl;
string s1 = "Hello", s2 = "World";
cout << "Max(s1, s2): " << Max(s1, s2) << endl;
return 0;
}
आउटपुट
Max(i, j): 39 Max(f1, f2): 20.7 Max(s1, s2): World
जावा जेनेरिक्स
जावा जेनेरिक मेथड्स और जेनेरिक क्लासेज प्रोग्रामर्स को एक ही मेथड डिक्लेरेशन के साथ संबंधित मेथड्स के सेट को निर्दिष्ट करने में सक्षम बनाते हैं, या एक ही क्लास डिक्लेरेशन के साथ संबंधित प्रकारों के सेट को।
जेनेरिक्स कंपाइल-टाइम टाइप सेफ्टी भी प्रदान करते हैं जो प्रोग्रामर्स को कंपाइल टाइम पर अमान्य प्रकारों को पकड़ने की अनुमति देता है।
जावा जेनेरिक मेथड उदाहरण
public class GenericMethodTest {
// जेनेरिक मेथड printArray
public static <E> void printArray(E[] inputArray) {
for (E element : inputArray) {
System.out.printf("%s ", element);
}
System.out.println();
}
public static void main(String args[]) {
Integer[] intArray = {1, 2, 3, 4, 5};
Double[] doubleArray = {1.1, 2.2, 3.3, 4.4};
Character[] charArray = {'H', 'E', 'L', 'L', 'O'};
System.out.println("Array integerArray contains:");
printArray(intArray);
System.out.println("\nArray doubleArray contains:");
printArray(doubleArray);
System.out.println("\nArray characterArray contains:");
printArray(charArray);
}
}
आउटपुट
Array integerArray contains: 1 2 3 4 5 Array doubleArray contains: 1.1 2.2 3.3 4.4 Array characterArray contains: H E L L O
टेम्पलेट्स और जेनेरिक्स के बीच अंतर
| पहलू | C++ टेम्पलेट्स | जावा जेनेरिक्स |
|---|---|---|
| कार्यान्वयन | कंपाइल टाइम पर कोड जनरेशन (टेम्पलेट इंस्टेंशिएशन) | टाइप इरेज़र (Type Erasure) - रनटाइम पर सिंगल क्लास |
| टाइप पैरामीटर्स | कोई भी प्रकार: प्रिमिटिव्स, क्लासेज, नॉन-टाइप पैरामीटर्स | केवल रेफरेंस टाइप्स (रैपर क्लासेज आवश्यक) |
| रनटाइम ओवरहेड | कोई नहीं (कोड इंलाइन/विशिष्ट) | कास्टिंग ओवरहेड, टाइप चेक्स |
| कोड ब्लोट | संभावित (प्रत्येक इंस्टेंशिएशन के लिए कोड कॉपी) | नहीं (सिंगल बाइटकोड) |
| स्पेशलाइज़ेशन | पूर्ण और आंशिक स्पेशलाइज़ेशन समर्थित | नहीं (वाइल्डकार्ड्स और बाउंड्स का उपयोग) |
| टेम्पलेट मेटाप्रोग्रामिंग | शक्तिशाली (कंपाइल-टाइम कंप्यूटेशन) | सीमित (एनोटेशन प्रोसेसिंग) |
| SFINAE / कॉन्सेप्ट्स | उन्नत बाधाएं (C++20 कॉन्सेप्ट्स) | बाउंडेड टाइप पैरामीटर्स (<T extends...>) |
मुख्य अंतर सारांश
- C++: "लेट टाइपिंग" और टेम्पलेट मेटाप्रोग्रामिंग, प्रत्येक इंस्टेंशिएशन के लिए नई क्लास उत्पन्न करता है।
- Java: टाइप इरेज़र का उपयोग करता है; कंपाइल टाइम पर सख्त टाइप चेक सुनिश्चित करता है। बाइटकोड नॉन-जेनेरिक कोड के समतुल्य उत्पन्न करता है।
- प्रिमिटिव्स: C++ प्रिमिटिव्स (int, double) को सीधे सपोर्ट करता है; Java को रैपर क्लासेज (Integer, Double) की आवश्यकता होती है।