2012-07-05 18 views
9

मैं टेम्पलेट टेम्पलेट पैरामीटर से संबंधित कुछ और खोज रहा था और this answer पर हुआ जो दावा करता है कि टेम्पलेट टेम्पलेट टेम्पलेट पैरामीटर मानक द्वारा अनुमत नहीं हैं।टेम्पलेट टेम्पलेट टेम्पलेट पैरामीटर मानक का एक विस्तार या हिस्सा हैं?

हालांकि, निम्नलिखित कोड नवीनतम बजना (3.2) और नवीनतम जीसीसी (4.8) में संकलित:

template<template<template<typename> class> class T> struct test {}; 
template<template<typename> class T> struct foo {}; 
test<foo> bar; 

इस एक विस्तार है, या अन्य जवाब वास्तव में गलत है और इसके द्वारा अनुमति दी है मानक? यदि नहीं, तो क्या चूक के लिए कोई विशेष कारण है?

+0

@ क्रिस ओपी का अर्थ है 4.8 का स्नैपशॉट। मैं थोड़ी देर के लिए एक का उपयोग कर रहा हूँ। – juanchopanza

+0

हाँ, मेरे पास मैकपॉर्ट्स से स्नैपशॉट हैं ... इसलिए, शायद नवीनतम एसवीएन या ऐसा कुछ भी नहीं। – celticminstrel

+0

यह आइडिया पर gcc 4.5 पर भी संकलित करता है http://ideone.com/BUAuw – TemplateRex

उत्तर

8

std::vector<int> में कक्षा टेम्पलेट std::vector पैरामीटर के रूप में int टाइप किया गया है। std::get<42>(some_tuple) में, फ़ंक्शन टेम्पलेट std::get पैरामीटर के रूप में 42 मान को पारित किया गया है। शायद अकल्पनीय रूप से पूर्व प्रकार के तर्क को टेम्पलेट (या टेम्पलेट प्रकार तर्क) का एक प्रकार तर्क कहा जाता है जबकि बाद वाला प्रकार एक (टेम्पलेट) गैर-प्रकार तर्क होता है।

लेकिन टेम्पलेट्स अन्य प्रकार के तर्क भी स्वीकार कर सकते हैं: अन्य टेम्पलेट्स। उदाहरण के लिए template<template<typename> class T> void foo(); टेम्पलेट को तर्क के रूप में लेते हुए एक फ़ंक्शन टेम्पलेट घोषित करता है, जो स्वयं एक प्रकार का तर्क लेता है। (एक नोट के रूप में, जबकि टेम्पलेट्स 'गैर-प्रकार तर्क' शब्द नहीं हैं, फिर भी टेम्पलेट टेम्पलेट तर्कों को कवर नहीं करते हैं। यह template<int NonTypeArgument> जैसे तर्कों के लिए आरक्षित है।)

चूंकि टेम्पलेट टेम्पलेट में ऐसी कोई चीज़ नहीं है सी ++ (कक्षा, फ़ंक्शन, और उपनाम टेम्पलेट्स हैं - लेकिन वे सामूहिक रूप से 'टेम्पलेट्स' वैसे भी हैं), टेम्पलेट टेम्पलेट टेम्पलेट पैरामीटर जैसी कोई चीज़ नहीं है। आपके पास मिल टेम्पलेट टेम्पलेट पैरामीटर से एक रन है, जहां अपेक्षित टेम्पलेट तर्क में टेम्पलेट टेम्पलेट तर्क स्वयं होता है। मुझे मानक में कोई संदर्भ नहीं मिल रहा है जो इस पर रोक लगाता है, जैसे कि आप दावों को लिंक करते हैं।