C# जेनेरिक्स और C++ टेम्प्लेट्स दोनों पैरामीट्रिक पॉलीमॉर्फिज्म (पैरामीटराइज्ड टाइप्स) प्रदान करते हैं, लेकिन उनके कार्यान्वयन और क्षमताओं में महत्वपूर्ण अंतर हैं।
तुलना तालिका
| विशेषता |
C# जेनेरिक्स |
C++ टेम्प्लेट्स |
| लचीलापन (Flexibility) |
कम लचीले - टाइप पैरामीटर्स पर कंस्ट्रेंट्स आवश्यक |
अधिक लचीले - किसी भी टाइप/मान के साथ काम कर सकते हैं |
| स्पष्ट विशेषज्ञता (Explicit Specialization) |
समर्थित नहीं |
समर्थित - विशिष्ट टाइप्स के लिए विशेष कार्यान्वयन |
| आंशिक विशेषज्ञता (Partial Specialization) |
समर्थित नहीं |
समर्थित |
| टाइप पैरामीटर बेस क्लास |
टाइप पैरामीटर बेस क्लास नहीं हो सकता |
टेम्प्लेट पैरामीटर बेस क्लास हो सकता है |
| डिफॉल्ट टाइप पैरामीटर्स |
समर्थित नहीं (C# 10 से पहले) |
समर्थित |
| नॉन-टाइप टेम्प्लेट पैरामीटर्स |
समर्थित नहीं (केवल टाइप पैरामीटर्स) |
समर्थित (इंटीजर, पॉइंटर्स, रेफरेंसेज, आदि) |
| कंपाइलेशन मॉडल |
रनटाइम पर कोड जनरेशन (JIT) - साझा कोड |
कंपाइल-टाइम कोड जनरेशन - प्रत्येक इंस्टेंशिएशन के लिए अलग कोड |
| रनटाइम सपोर्ट |
पूर्ण रनटाइम सपोर्ट - रिफ्लेक्शन के माध्यम से जांच संभव |
कोई रनटाइम प्रतिनिधित्व नहीं - केवल कंपाइल टाइम |
| कोड ब्लोट |
नहीं - एक ही नेटिव कोड सभी रेफरेंस टाइप्स के लिए साझा |
हां - प्रत्येक टाइप संयोजन के लिए अलग कोड जनरेट होता है |
| कंस्ट्रेंट्स |
where T : class, struct, new(), base, interface |
कॉन्सेप्ट्स (C++20), SFINAE, static_assert |
C# जेनेरिक्स उदाहरण
// कंस्ट्रेंट्स के साथ
public class Repository where T : class, new() {
public T Create() => new T();
public void Save(T entity) { /* ... */ }
}
// उपयोग
var repo = new Repository(); // User को class होना चाहिए और parameterless ctor होना चाहिए
C++ टेम्प्लेट उदाहरण
// नॉन-टाइप पैरामीटर
template
class FixedArray {
T data[Size];
public:
T& operator[](int i) { return data[i]; }
};
// स्पष्ट विशेषज्ञता
template <>
class FixedArray {
// बूल्स के लिए बिट-पैक्ड स्टोरेज
unsigned short bits;
};
// आंशिक विशेषज्ञता
template
class FixedArray { /* पॉइंटर्स के लिए विशेष */ }
मुख्य दार्शनिक अंतर
- C++ टेम्प्लेट्स: कंपाइल-टाइम कोड जनरेशन मैकेनिज्म (मैक्रो जैसा लेकिन टाइप-सेफ)। "टेम्प्लेट मेटाप्रोग्रामिंग" सक्षम करता है।
- C# जेनेरिक्स: रनटाइम टाइप सिस्टम फीचर। टाइप सेफ्टी और कोड पुन: उपयोग पर केंद्रित, मेटाप्रोग्रामिंग पर नहीं।
व्यावहारिक प्रभाव
| परिदृश्य |
C# दृष्टिकोण |
C++ दृष्टिकोण |
| गणितीय ऑपरेशन्स (T + T) |
इंटरफेस कंस्ट्रेंट या डायनामिक/ऑपरेटर ओवरलोडिंग |
सीधे ऑपरेटर उपयोग (यदि T सपोर्ट करता है) |
| कंपाइल-टाइम गणना |
सोर्स जनरेटर्स (आधुनिक), कॉन्स्ट एक्सप्रेशन्स सीमित |
टेम्प्लेट मेटाप्रोग्रामिंग, constexpr |
| वैल्यू टाइप्स के लिए प्रदर्शन |
बॉक्सिंग से बचने के लिए विशेष कोड जनरेट होता है |
प्रत्येक टाइप के लिए पूरी तरह विशेष कोड |
| रिफ्लेक्शन/इंट्रोस्पेक्शन |
पूर्ण सपोर्ट: typeof(List<int>) |
नहीं (RTTI सीमित) |
निष्कर्ष
- C# जेनेरिक्स सुरक्षित, सरल, रनटाइम-एक्सेसिबल हैं - एप्लिकेशन डेवलपमेंट के लिए आदर्श।
- C++ टेम्प्लेट्स शक्तिशाली, जटिल, कंपाइल-टाइम हैं - लाइब्रेरी/सिस्टम प्रोग्रामिंग के लिए आदर्श।
- C# में मेटाप्रोग्रामिंग के लिए: सोर्स जनरेटर्स (C# 9+/ .NET 5+) उपयोग करें।