कागज परिचय भ्रामक है: मुहावरा वास्तव में
template <typename T, T t>
है यह जो एक प्रकार T
और उस प्रकार के एक मूल्य t
पर निर्भर करता है एक टेम्पलेट को दर्शाता है। नोटेशन थोड़ा भारी है क्योंकि अधिकांश परिस्थितियों में इस प्रकार के मूल्य को स्वयं से लिया जा सकता है।
उदा।
// the current definition notation
template <typename T, T t> void f() { t.f(); };
//// the proposed definition notation
//// the parameter t depends on an implicit typename parameter T
// template <using typename T, T t> void f() { t.f(); };
struct foo {
void f(){
// some computation
}
};
foo bar;
int main(){
// the current instantiation notation
f<foo,bar>();
//// the proposed instantiation notation
//// we know that bar is of type foo, so we don't need to specify it
// f<bar>();
}
प्रस्ताव नोटेशन को लिखना आसान बनाने के लिए थोड़ा "सिंटेक्टिक चीनी" पेश करने के बारे में है।
इसके अलावा, ऊपर दिया गया उदाहरण इसके विवरण में छोटा है (और संभवतः गलत है, क्योंकि टेम्पलेट पैरामीटर constexpr
होने की आवश्यकता है), लेकिन पेपर कई स्थितियों का वर्णन करता है जहां वर्तमान नोटेशन काफी बालों वाली हो सकती है, पठनीयता और समग्र आसानी को कम कर सकती है प्रोग्रामिंग।
टेम्पलेट के साथ शुरू करें 'टेम्पलेट शून्य foo (टी टी); '। उस पैरामीटर को एक संकलन-समय मान बनाएं: 'टेम्पलेट <टाइपनाम टी, टी टी> शून्य बार();' (मुझे लगता है कि आपका मतलब था 'कक्षा' के बजाय)। अब इस बारे में सोचें कि आप 'foo (5);' टी को 'int' होने के लिए कैसे कॉल कर सकते हैं, लेकिन इसे 'बार' के साथ करने के लिए, आपको 'बार (); 'की आवश्यकता है। क्या यह सही दिशा में जा रहा है? –
chris
मेरा मतलब टी टी था, कक्षा टी नहीं। फिक्स्ड कि। –
@ क्रिसिस मैं देखता हूं कि अब आप कहां जा रहे हैं। बार को हम जो भी प्रकार देते हैं उस पर जेनेरिक होना आवश्यक है, लेकिन उसी टेम्पलेट पैरामीटर के समान प्रकार का मूल्य भी ले रहा है। हमें यह निर्धारित करने के लिए कि टाइप 5 एक int है, दोनों प्रकार और मान को निर्दिष्ट करने की आवश्यकता है। प्रस्ताव इस प्रतिबिंब पुस्तकालय में इसका उपयोग दिखाता है, लेकिन मैंने इसे आज तक कभी नहीं देखा है। इसका उपयोग कैसे किया जा सकता है? –