आंशिक विशेषज्ञीकरण
टेम्पलेट पैटर्न को विशेषीकृत करें
आंशिक विशेषज्ञीकरण, CoddyKit पर C++ Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह C++ Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
आंशिक विशेषीकरण क्या है
आंशिक विशेषीकरण एक सटीक प्रकार के बजाय, समान पैटर्न वाले प्रकारों के परिवार के लिए टेम्पलेट को अनुकूलित करता है।
- केवल क्लास टेम्पलेट इसका समर्थन करते हैं।
- आप कुछ पैरामीटरों को अभी भी सामान्य रखते हैं।
#include <iostream>
template <typename T>
struct Traits { static const char* kind() { return "value"; } };
template <typename T>
struct Traits<T*> { static const char* kind() { return "pointer"; } };
int main() {
std::cout << Traits<int>::kind() << '\n';
std::cout << Traits<int*>::kind() << '\n';
return 0;
}पॉइंटरों का मिलान
T* पैटर्न किसी भी पॉइंटर प्रकार से मेल खाता है, जिससे आप सभी पॉइंटरों को एक ही विशेषीकरण से संभाल सकते हैं।
#include <iostream>
template <typename T>
struct Deref { static T get(T v) { return v; } };
template <typename T>
struct Deref<T*> { static T get(T* p) { return *p; } };
int main() {
int x = 42;
std::cout << Deref<int>::get(7) << '\n';
std::cout << Deref<int*>::get(&x) << '\n';
return 0;
}फ़ंक्शनों का आंशिक विशेषीकरण नहीं किया जा सकता
केवल क्लास (और चर) टेम्पलेट आंशिक विशेषीकरण का समर्थन करते हैं। फ़ंक्शनों के लिए इसके बजाय ओवरलोडिंग का उपयोग करें।
#include <iostream>
template <typename T>
void show(T) { std::cout << "value\n"; }
template <typename T>
void show(T*) { std::cout << "pointer\n"; }
int main() {
int x = 0;
show(5);
show(&x);
return 0;
}दो पैरामीटरों में से एक का विशेषीकरण
एक से अधिक प्रकार वाले पैरामीटरों के साथ आप एक को निश्चित और दूसरे को खुला रख सकते हैं, जिससे प्रकारों में किसी पैटर्न से मिलान किया जा सके।
#include <iostream>
template <typename A, typename B>
struct Pair { static const char* kind() { return "mixed"; } };
template <typename A>
struct Pair<A, A> { static const char* kind() { return "same types"; } };
int main() {
std::cout << Pair<int, double>::kind() << '\n';
std::cout << Pair<int, int>::kind() << '\n';
return 0;
}ऐरे का मिलान
आप ऐसे पैटर्न से ऐरे प्रकारों का मिलान कर सकते हैं, जो तत्व के प्रकार और आकार को गैर-प्रकार वाले पैरामीटर के रूप में ग्रहण करता है।
#include <iostream>
template <typename T>
struct Info { static int size() { return 1; } };
template <typename T, int N>
struct Info<T[N]> { static int size() { return N; } };
int main() {
std::cout << Info<int>::size() << '\n';
std::cout << Info<int[5]>::size() << '\n';
return 0;
}const पैटर्न
कोई विशेषीकरण const का मिलान करके const T पैटर्न के माध्यम से const को हटा या पहचान सकता है।
#include <iostream>
template <typename T>
struct IsConst { static const bool value = false; };
template <typename T>
struct IsConst<const T> { static const bool value = true; };
int main() {
std::cout << std::boolalpha;
std::cout << IsConst<int>::value << '\n';
std::cout << IsConst<const int>::value << '\n';
return 0;
}सबसे विशिष्ट विशेषीकरण चुना जाता है
जब कई विशेषीकरण मेल खा सकते हैं, तो कंपाइलर सबसे विशिष्ट विशेषीकरण चुनता है—अर्थात वह पैटर्न जो सबसे अधिक विशिष्ट हो।
#include <iostream>
template <typename T>
struct K { static int v() { return 0; } };
template <typename T>
struct K<T*> { static int v() { return 1; } };
template <>
struct K<int*> { static int v() { return 2; } };
int main() {
std::cout << K<double*>::v() << ' ' << K<int*>::v() << '\n';
return 0;
}संदर्भ पैटर्न
आप संदर्भ प्रकारों का भी मिलान कर सकते हैं और संदर्भ तथा साधारण मान में अंतर कर सकते हैं।
#include <iostream>
template <typename T>
struct Cat { static const char* k() { return "value"; } };
template <typename T>
struct Cat<T&> { static const char* k() { return "lvalue ref"; } };
int main() {
std::cout << Cat<int>::k() << '\n';
std::cout << Cat<int&>::k() << '\n';
return 0;
}प्रकार-गुण बनाना
आंशिक विशेषीकरण ही प्रकार-गुणों के पीछे का तंत्र है। यहाँ हाथ से बनाया गया remove_pointer दिया गया है।
#include <iostream>
#include <type_traits>
template <typename T>
struct RemovePtr { using type = T; };
template <typename T>
struct RemovePtr<T*> { using type = T; };
int main() {
std::cout << std::boolalpha;
std::cout << std::is_same<RemovePtr<int*>::type, int>::value << '\n';
return 0;
}पैटर्नों का संयोजन
आप पैटर्नों को मिला सकते हैं, जैसे const के लिए पॉइंटर का मिलान करना, ताकि परतदार प्रकार संरचनाओं को संभाला जा सके।
#include <iostream>
template <typename T>
struct Desc { static const char* k() { return "plain"; } };
template <typename T>
struct Desc<const T*> { static const char* k() { return "ptr to const"; } };
int main() {
std::cout << Desc<int>::k() << '\n';
std::cout << Desc<const int*>::k() << '\n';
return 0;
}एक उपयोगी कंटेनर-गुण
कंटेनर-जैसे टेम्पलेट से तत्व का प्रकार निकालने के लिए आंशिक विशेषीकरण का उपयोग करें।
#include <iostream>
#include <type_traits>
template <typename C>
struct Element { using type = void; };
template <template <typename> class C, typename T>
struct Element<C<T>> { using type = T; };
template <typename T>
struct Box { T item; };
int main() {
std::cout << std::boolalpha;
std::cout << std::is_same<Element<Box<int>>::type, int>::value << '\n';
return 0;
}त्वरित जाँच
आंशिक विशेषीकरण की अपनी समझ जाँचें।
पुनरावलोकन
आपने आंशिक विशेषीकरण के बारे में सीखा:
- यह
T*याconst Tजैसे प्रकारों के पैटर्न के लिए क्लास टेम्पलेट को अनुकूलित करता है - फ़ंक्शन आंशिक विशेषीकरण के बजाय ओवरलोडिंग का उपयोग करते हैं
- मेल खाने वाले संस्करणों में से सबसे विशिष्ट संस्करण चुना जाता है
- यह
remove_pointerजैसे प्रकार-गुणों को शक्ति देता है
अगले भाग में आप SFINAE सीखेंगे, जो किसी प्रकार के योग्य होने पर ही फ़ंक्शन को सक्षम करने का तरीका है।
एआई शिक्षक के साथ C++ सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 51
- पाठ
- 203
अक्सर पूछे जाने वाले प्रश्न
क्या “आंशिक विशेषज्ञीकरण” पाठ निःशुल्क है?
हाँ — C++ Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “आंशिक विशेषज्ञीकरण” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“आंशिक विशेषज्ञीकरण” में मैं क्या सीखूँगा?
टेम्पलेट पैटर्न को विशेषीकृत करें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C++ Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C++ Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C++ Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“आंशिक विशेषज्ञीकरण” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C++ Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C++ Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- पूर्ण विशेषज्ञीकरण
- आंशिक विशेषज्ञीकरण
- SFINAE
- enable_if पैटर्न