C++ Academy · पाठ

पूर्ण विशेषज्ञीकरण

किसी प्रकार के लिए टेम्पलेट अनुकूलित करें

पाठ 1, कुल 4 में से13 चरण

पूर्ण विशेषज्ञीकरण, CoddyKit पर C++ Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह C++ Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

पुनरावलोकन: टेम्पलेट

टेम्पलेट कोड के एक हिस्से को कई प्रकारों के साथ काम करने देता है। कंपाइलर आपके द्वारा उपयोग किए जाने वाले हर प्रकार के लिए उसका ठोस संस्करण बनाता है।

  • सामान्य रूप हर प्रकार को संभालता है।
  • कभी-कभी किसी एक प्रकार को विशेष व्यवहार की आवश्यकता होती है।
#include <iostream>

template <typename T>
T maxOf(T a, T b) { return a > b ? a : b; }

int main() {
    std::cout << maxOf(3, 9) << ' ' << maxOf(2.5, 1.5) << '\n';
    return 0;
}

पूर्ण विशेषज्ञता क्या है

पूर्ण विशेषज्ञता किसी एक विशिष्ट प्रकार के लिए पूरी तरह अलग कार्यान्वयन देती है और केवल उस प्रकार के लिए सामान्य टेम्पलेट को अधिलेखित करती है।

#include <iostream>

template <typename T>
void describe(T) { std::cout << "some type\n"; }

template <>
void describe(int) { std::cout << "an int\n"; }

int main() {
    describe(3.14);
    describe(42);
    return 0;
}

सिंटैक्स

पूर्ण विशेषज्ञता खाली कोणीय कोष्ठकों template <> से शुरू होती है और विशेषज्ञता में सटीक प्रकार का नाम देती है।

#include <iostream>

template <typename T>
struct TypeName { static const char* get() { return "unknown"; } };

template <>
struct TypeName<bool> { static const char* get() { return "bool"; } };

int main() {
    std::cout << TypeName<double>::get() << '\n';
    std::cout << TypeName<bool>::get() << '\n';
    return 0;
}

क्लास टेम्पलेट को विशेषज्ञ बनाना

पूरे क्लास टेम्पलेट को विशेषज्ञ बनाया जा सकता है, जिससे किसी प्रकार को प्राथमिक टेम्पलेट से अलग अपने सदस्य और व्यवहार मिल जाते हैं।

#include <iostream>

template <typename T>
struct Storage {
    T value;
    void show() { std::cout << "value: " << value << '\n'; }
};

template <>
struct Storage<bool> {
    bool value;
    void show() { std::cout << (value ? "true" : "false") << '\n'; }
};

int main() {
    Storage<int> s{5}; s.show();
    Storage<bool> b{true}; b.show();
    return 0;
}

विशेषज्ञता क्यों करें

विशेषज्ञता उन प्रकारों को संभालती है जिन्हें अलग तर्क की आवश्यकता होती है, जैसे const char* को पॉइंटर की तुलना के बजाय स्ट्रिंग की तुलना चाहिए।

#include <iostream>
#include <cstring>

template <typename T>
bool equal(T a, T b) { return a == b; }

template <>
bool equal(const char* a, const char* b) { return std::strcmp(a, b) == 0; }

int main() {
    std::cout << std::boolalpha;
    std::cout << equal(5, 5) << '\n';
    std::cout << equal("hi", "hi") << '\n';
    return 0;
}

एकल सदस्य को विशेषज्ञ बनाना

क्लास टेम्पलेट के लिए आप किसी दिए गए प्रकार हेतु केवल एक सदस्य फ़ंक्शन को विशेषज्ञ बना सकते हैं और बाकी का पुनः उपयोग कर सकते हैं।

#include <iostream>

template <typename T>
struct Printer {
    void print(T v) { std::cout << v << '\n'; }
};

template <>
void Printer<char>::print(char v) {
    std::cout << "char: " << v << '\n';
}

int main() {
    Printer<int>{}.print(7);
    Printer<char>{}.print('A');
    return 0;
}

सटीक मिलान सामान्य रूप से बेहतर है

जब सटीक प्रकार के लिए पूर्ण विशेषज्ञता मौजूद हो, तो कंपाइलर हमेशा प्राथमिक टेम्पलेट की जगह उसे प्राथमिकता देता है।

#include <iostream>

template <typename T>
int rank() { return 0; }

template <>
int rank<double>() { return 99; }

int main() {
    std::cout << rank<int>() << ' ' << rank<double>() << '\n';
    return 0;
}

विशेषज्ञता प्राथमिक टेम्पलेट के बाद होनी चाहिए

विशेषज्ञता को प्राथमिक टेम्पलेट दिखाई देने के बाद घोषित किया जाना चाहिए, अन्यथा कंपाइलर के पास विशेषज्ञ बनाने के लिए कुछ नहीं होगा।

#include <iostream>

template <typename T>
const char* kind() { return "generic"; }

template <>
const char* kind<float>() { return "float"; }

int main() {
    std::cout << kind<int>() << ' ' << kind<float>() << '\n';
    return 0;
}

std टेम्पलेट को विशेषज्ञ बनाना

आप अपनी प्रकारों के लिए कुछ मानक लाइब्रेरी टेम्पलेट, जैसे std::hash, विशेषज्ञ बना सकते हैं, ताकि वे हैश किए गए कंटेनर के साथ काम कर सकें।

#include <iostream>

struct Point { int x, y; };

template <typename T>
struct Hasher { size_t operator()(const T&) { return 0; } };

template <>
struct Hasher<Point> {
    size_t operator()(const Point& p) { return p.x * 31 + p.y; }
};

int main() {
    Hasher<Point> h;
    std::cout << h(Point{2, 3}) << '\n';
    return 0;
}

मान-विशेषीकरण

गैर-प्रकार वाले टेम्पलेट पैरामीटरों का विशेषीकरण विशिष्ट मानों के आधार पर किया जा सकता है, जो संकलन-समय की तालिकाओं के लिए उपयोगी है।

#include <iostream>

template <int N>
struct Fib { static const int value = Fib<N-1>::value + Fib<N-2>::value; };

template <>
struct Fib<0> { static const int value = 0; };

template <>
struct Fib<1> { static const int value = 1; };

int main() {
    std::cout << Fib<10>::value << '\n';
    return 0;
}

व्यवहार सुसंगत रखें

किसी विशेषीकरण को मूल टेम्पलेट जैसा ही वैचारिक अनुबंध बनाए रखना चाहिए; केवल कार्यान्वयन बदलना चाहिए। अन्यथा इसका उपयोग करने वाले लोग चौंक सकते हैं।

#include <iostream>

template <typename T>
T zero() { return T{}; }

template <>
int zero<int>() { return 0; }

int main() {
    std::cout << zero<int>() << ' ' << zero<double>() << '\n';
    return 0;
}

त्वरित जाँच

पूर्ण विशेषीकरण के वाक्यविन्यास की अपनी समझ जाँचें।

पुनरावलोकन

आपने पूर्ण विशेषीकरण के बारे में सीखा:

  • यह एक सटीक प्रकार के लिए समर्पित कार्यान्वयन प्रदान करता है
  • इसे template <> और ठोस प्रकार के साथ लिखा जाता है
  • कंपाइलर हमेशा सटीक विशेषीकरण को प्राथमिकता देता है
  • यह फ़ंक्शन, क्लास, एकल सदस्यों और विशिष्ट मानों के लिए काम करता है

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

शुरुआत निःशुल्क

एआई शिक्षक के साथ C++ सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
51
पाठ
203

अक्सर पूछे जाने वाले प्रश्न

क्या “पूर्ण विशेषज्ञीकरण” पाठ निःशुल्क है?

हाँ — C++ Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “पूर्ण विशेषज्ञीकरण” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“पूर्ण विशेषज्ञीकरण” में मैं क्या सीखूँगा?

किसी प्रकार के लिए टेम्पलेट अनुकूलित करें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C++ Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या C++ Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C++ Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।

“पूर्ण विशेषज्ञीकरण” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस C++ Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर C++ Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. पूर्ण विशेषज्ञीकरण
  2. आंशिक विशेषज्ञीकरण
  3. SFINAE
  4. enable_if पैटर्न
← C++ Academy पर वापस जाएँ