टेम्पलेट तर्क कटौती अच्छी तरह से यहां काम करता है, क्योंकि फ़ंक्शन टेम्पलेट के लिए, बाद के टेम्पलेट तर्क फ़ंक्शन तर्कों द्वारा घटाए जा सकते हैं। इस मामले में, टेम्पलेट तर्क U
फ़ंक्शन तर्क u
से लिया जा सकता है। ध्यान दें कि क्लास टेम्पलेट के लिए, जैसा कि आपने अपेक्षित था, बाद में टेम्पलेट-पैरामीटर डिफ़ॉल्ट टेम्पलेट-तर्क के बाद या तो एक डिफ़ॉल्ट टेम्पलेट-तर्क होगा या टेम्पलेट पैरामीटर पैक होगा।
$14.1/11 Template parameters [temp.param]:
एक वर्ग टेम्पलेट, चर टेम्पलेट, या उर्फ टेम्पलेट की एक टेम्पलेट पैरामीटर एक डिफ़ॉल्ट टेम्पलेट तर्क हैं, तो प्रत्येक बाद टेम्पलेट पैरामीटर या तो एक डिफ़ॉल्ट टेम्पलेट तर्क होगा आपूर्ति या टेम्पलेट पैरामीटर पैक हो। यदि प्राथमिक वर्ग टेम्पलेट का एक टेम्पलेट-पैरामीटर, प्राथमिक चर टेम्पलेट, या उपनाम टेम्पलेट टेम्पलेट पैरामीटर पैक है, तो यह अंतिम टेम्पलेट-पैरामीटर होगा। फ़ंक्शन टेम्पलेट का टेम्पलेट पैरामीटर पैक का पालन किसी अन्य टेम्पलेट पैरामीटर द्वारा नहीं किया जाएगा जब तक कि टेम्पलेट पैरामीटर फ़ंक्शन टेम्पलेट के पैरामीटर-प्रकार-सूची ([dcl.fct]) से घटाया गया हो या डिफ़ॉल्ट तर्क हो ([temp.deduct])। एक कटौती गाइड टेम्पलेट ([temp.deduct.guide]) का एक टेम्पलेट पैरामीटर में डिफ़ॉल्ट तर्क नहीं है कटौती मार्गदर्शिका टेम्पलेट की पैरामीटर-प्रकार-सूची से घटाया जाएगा। [उदाहरण:
template<class T1 = int, class T2> class B; // error
// U can be neither deduced from the parameter-type-list nor specified
template<class... T, class... U> void f() { } // error
template<class... T, class U> void g() { } // error
- अंत उदाहरण]
तुम देखो क्या होगा U
undeducible बनाने के लिए कोशिश करते हैं और हो सकता है:
template <bool T=true, class U> //"default" from LEFT-most parameter
void f(){
if(T){ cout<<true;}
else cout<<false;
}
int main() {
f(); // Fail. Can't deduce U.
f<true>(); // Fail. Can't deduce U.
f<true, int>(); // Fine. T=true, U=int.
return 0;
}
नोट आप सभी टेम्पलेट तर्क स्पष्ट रूप से निर्दिष्ट करने के लिए कोड को काम करने के लिए, जो डिफ़ॉल्ट टेम्पलेट तर्कों को अर्थहीन बनाता है। यदि आप f()
या f<true>()
काम करना चाहते हैं, तो आपको U
को एक डिफ़ॉल्ट टेम्पलेट-तर्क भी देना होगा (या इसे टेम्पलेट पैरामीटर पैक बनाएं)।
template <bool T=true, class U=int>
void f(){
if(T){ cout<<true;}
else cout<<false;
}
int main() {
f(); // Fine. T=true, U=int
f<false>(); // Fine. T=false, U=int
f<false, char>(); // Fine. T=false, U=char
return 0;
}