विषय पर बढ़ें

अंतिम अद्यतन:2026-10-12

C++ टेम्पलेट disambiguator

1.बैकग्राउंड

हाल ही में एक कोड देखा:

 auto chunk_left = first_sort_key.template GetChunk<ArrayType>(left);

क्या आप बता सकते हैं, यहाँ .template का क्या मतलब है?

यह सेक्शन वास्तविक उदाहरणों से शुरू करके इसके महत्व पर चर्चा करेगा।

2.template disambiguator

C++ में, जब टेम्पलेट के dependent names का उपयोग किया जाता है, तो कभी-कभी कंपाइलर की मदद के लिए template disambiguator की ज़रूरत पड़ती है ताकि वह इन नामों में अंतर कर सके। "dependent names" से तात्पर्य उन टाइप्स या वैल्यूज़ से है जो टेम्पलेट पैरामीटर पर निर्भर होते हैं, कंपाइलर टेम्पलेट इंस्टेंशिएट होने से पहले उनका सटीक अर्थ निर्धारित नहीं कर सकता। इससे कंपाइलर इन नामों को पार्स करते समय द्विअर्थता (ambiguity) का सामना कर सकता है।

template disambiguator "template" कीवर्ड का उपयोग करके कंपाइलर को स्पष्ट रूप से बताता है कि कोई खास नाम एक टेम्पलेट है। इस तरह कंपाइलर उस नाम को सही ढंग से पार्स कर पाता है और द्विअर्थता नहीं उत्पन्न होती।

template कीवर्ड केवल :: (स्कोप रेज़ोल्यूशन), -> (पॉइंटर के ज़रिए मेंबर एक्सेस) और . (मेंबर एक्सेस) ऑपरेटरों के साथ उपयोग हो सकता है, निम्नलिखित सभी मान्य उदाहरण हैं

  • T::template foo();
  • s.template foo();
  • this->template foo();
  • typename T::template iterator::value_type v;

आधिकारिक सामग्री:

https://en.cppreference.com/w/cpp/language/dependent_name

मान लीजिए नीचे दिया गया कोड है, अगर हम .template न लगाएँ तो क्या मिलेगा?

template <typename T>
auto foo_is_not_a_template() {
  // ((T::foo) < 34) > (::val())
  return T::foo<34>::val();
}

उपरोक्त को इस तरह पार्स किया जाएगा: ((T::foo) < 34) > (::val())

इसके संगत .template वाला उदाहरण है:

template <typename T>
auto foo_is_a_template() {
  return T::template foo<34>::val();
}

इस तरह कॉल सही ढंग से टेम्पलेट, foo<34> के रूप में पार्स होगा।

इस सेक्शन का पूरा कोड Knowledge Planet पर जारी किया जाएगा, रुचि हो तो जुड़ सकते हैं, धन्यवाद!

संबंधित विषय

टिप्पणियाँ