Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में टेम्पलेट्स बनाम जावा में जेनेरिक्स


टेम्पलेट्स जेनेरिक प्रोग्रामिंग की नींव हैं, जिसमें किसी विशेष प्रकार से स्वतंत्र तरीके से कोड लिखना शामिल है।

एक टेम्पलेट जेनेरिक क्लास या फ़ंक्शन बनाने के लिए एक ब्लूप्रिंट या फॉर्मूला है। लाइब्रेरी कंटेनर्स जैसे इटरेटर्स और एल्गोरिदम्स जेनेरिक प्रोग्रामिंग के उदाहरण हैं और टेम्पलेट अवधारणा का उपयोग करके विकसित किए गए हैं।

प्रत्येक कंटेनर की एक ही परिभाषा होती है, जैसे 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) की आवश्यकता होती है।
  1. - C# में जेनेरिक्स

    जेनेरिक्स आपको एक क्लास या मेथड लिखने की अनुमति देता है जो किसी भी डेटा टाइप के साथ काम कर सकता है।डेटा टाइप्स के लिए सब्स्टीट्यूट पैरामीटर्स के साथ क्लास या मेथड के लिए स्पेसिफिकेशन्स लिखें। जब कंपाइलर क्लास के लिए कंस्ट्रक्टर या मेथड के लिए फंक्शन कॉल का सामना करता है, तो यह विशिष्ट डेटा टाइप को स

  1. - C# जेनेरिक्स बनाम C++ टेम्प्लेट्स: तुलना

    C# जेनेरिक्स और C++ टेम्प्लेट्स दोनों पैरामीट्रिक पॉलीमॉर्फिज्म (पैरामीटराइज्ड टाइप्स) प्रदान करते हैं, लेकिन उनके कार्यान्वयन और क्षमताओं में महत्वपूर्ण अंतर हैं। तुलना तालिका विशेषता C# जेनेरिक्स C++ टेम्प्लेट्स लचीलापन (Flexibility) कम लचीले - टाइप पैरामीटर्स पर कंस्ट्रेंट्स आवश्यक अधिक ल

  1. - Java में टाइप इरेज़र

    परिचयजेनेरिक प्रोग्रामिंग का समर्थन करने के साथ-साथ सख्त प्रकार की जांच करने के लिए, Java टाइप इरेज़र को लागू करता है।जेनेरिक प्रकारों में सभी प्रकार के पैरामीटर्स को बाउंड (यदि अनबाउंडेड) या ऑब्जेक्ट प्रकार से बदल दिया जाता है। इस तरह, बाइटकोड में केवल क्लासेस, मेथड्स, और इंटरफेस होंगे।प्रकार को बन