2013-04-13 31 views
21

मैं this पढ़ रहा था और यह समझने की कोशिश कर रहा था कि N3601 क्या था। यह कहा गया है कि यह मुहावरे वेब खोज में बहुत कुछ आता है, लेकिन मुझे कुछ भी नहीं मिला।टेम्पलेट <typename टी, टी टी> idiom क्या है?

template<typename T, T t> 

मुहावरा क्या है, यह क्या हल है, यह कैसे किया जाता है, क्या अंतर्निहित टेम्पलेट पैरामीटर है, और क्या प्रस्ताव को ठीक करना चाहता है?

+2

टेम्पलेट के साथ शुरू करें 'टेम्पलेट शून्य foo (टी टी); '। उस पैरामीटर को एक संकलन-समय मान बनाएं: 'टेम्पलेट <टाइपनाम टी, टी टी> शून्य बार();' (मुझे लगता है कि आपका मतलब था 'कक्षा' के बजाय)। अब इस बारे में सोचें कि आप 'foo (5);' टी को 'int' होने के लिए कैसे कॉल कर सकते हैं, लेकिन इसे 'बार' के साथ करने के लिए, आपको 'बार (); 'की आवश्यकता है। क्या यह सही दिशा में जा रहा है? – chris

+0

मेरा मतलब टी टी था, कक्षा टी नहीं। फिक्स्ड कि। –

+0

@ क्रिसिस मैं देखता हूं कि अब आप कहां जा रहे हैं। बार को हम जो भी प्रकार देते हैं उस पर जेनेरिक होना आवश्यक है, लेकिन उसी टेम्पलेट पैरामीटर के समान प्रकार का मूल्य भी ले रहा है। हमें यह निर्धारित करने के लिए कि टाइप 5 एक int है, दोनों प्रकार और मान को निर्दिष्ट करने की आवश्यकता है। प्रस्ताव इस प्रतिबिंब पुस्तकालय में इसका उपयोग दिखाता है, लेकिन मैंने इसे आज तक कभी नहीं देखा है। इसका उपयोग कैसे किया जा सकता है? –

उत्तर

15

हल की जा रही समस्या टेम्पलेट गैर-प्रकार पैरामीटर से प्रकार को कम कर रही है।

को देखते हुए:

template<typename T> void foo(T); 
template<typename T, T> void bar(); 

यह foo के लिए T निकालना (उदाहरण के लिए, foo(10)T में परिणाम होगा int होने के लिए निष्कर्ष निकाला जा रहा है) के लिए संभव है, लेकिन यह bar के लिए T निकालना संभव नहीं है (bar<10>() होगा बस संकलित नहीं करें, आपको इसे bar<int,10>() के रूप में लिखना होगा)।

N3601 वाक्य रचना शुरू करने से इस फिक्सिंग का प्रस्ताव:

template<using typename T, T> void bar(); 

जो bar<10>() संकलन और कारण प्रकार T निष्कर्ष निकाला जा करने के लिए करने की अनुमति देगा।

5

कागज परिचय भ्रामक है: मुहावरा वास्तव में

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 होने की आवश्यकता है), लेकिन पेपर कई स्थितियों का वर्णन करता है जहां वर्तमान नोटेशन काफी बालों वाली हो सकती है, पठनीयता और समग्र आसानी को कम कर सकती है प्रोग्रामिंग।

+0

में अंतरित हैं और उस प्रकार का मान 'टी' एक अभिन्न निरंतर होना चाहिए, या एक सूचक होना चाहिए क्योंकि टेम्पलेट तर्कों में और कुछ भी अनुमति नहीं है। –

संबंधित मुद्दे