2012-02-07 24 views
9

Andrei's talk on GoingNative 2012 में वे वैराडिक टेम्पलेट्स के बारे में बात करते हैं, और वह पैरामीटर पैक विस्तारों के काम के तरीके के नीचे उदाहरण के माध्यम से एक बिंदु पर बताते हैं। इस विषय के लिए काफी नए होने के कारण मुझे यह पता लगाना मुश्किल था कि प्रत्येक मामले कैसे काम करता है, क्या कोई यह बता सकता है कि gun के प्रत्येक फ़ंक्शन कॉल में विस्तार कैसे कार्य करता है?वैराडिक टेम्पलेट्स पैक विस्तार

template<class... Ts> void fun(Ts... vs) { 
    gun(A<Ts...>::hun(vs)...); 
    gun(A<Ts...>::hun(vs...)); 
    gun(A<Ts>::hun(vs)...); 
} 
+1

आप शायद यह निर्दिष्ट करना चाहते हैं कि 'टीएस' (उदाहरण के लिए) 'शून्य *, int, char, std :: string' या कुछ है, इसलिए उत्तर थोड़ा बेहतर संरेखित होते हैं। –

उत्तर

9

1.

gun(A<Ts...>::hun(vs)...) 
=> gun(A<T1, T2, …, Tn>::hun(vs)...) 
=> gun(A<T1, T2, …, Tn>::hun(v1), 
     A<T1, T2, …, Tn>::hun(v2), 
     …, 
     A<T1, T2, …, Tn>::hun(vm)) 

2.

gun(A<Ts...>::hun(vs...)) 
=> gun(A<T1, T2, …, Tn>::hun(vs...)) 
=> gun(A<T1, T2, …, Tn>::hun(v1, v2, …, vm)) 

यह स्पष्ट होना चाहिए।

3.

gun(A<Ts>::hun(vs)...) 
=> gun(A<T1>::hun(v1), A<T2>::hun(v2), …, A<Tn>::hun(vn)) 

(इस मामले में कार्यक्रम यदि नियम और शर्तें की लंबाई बनाम अलग संकलन नहीं होगा)


... एक पैटर्न का विस्तार किया जाएगा (जो पैरामीटर पैक शामिल) इसे आगे बढ़ाना, जिसका अर्थ है। ,

foo(Ts, Us, Vs)... 
=> foo(T1, U1, V1), foo(T2, U2, V2), …, foo(Tn, Un, Vn) 

और अगर वहाँ विस्तार नेस्टेड रहते हैं अंतरतम पैटर्न: foo(Ts, Us, Vs)... में, सूची Ts, Us के प्रत्येक सदस्य, Vs (लॉक कदम में प्रगणित) उस पैटर्न में subsituted हो जाएगा, और एक अल्पविराम सूची बनाई है पहले विस्तार किया जाएगा। इसलिए, 1 मामले में, पैटर्न Ts पहले T1, T2, …, Tn में विस्तारित किया जाएगा। और फिर, पैटर्न बाहरी ... पूर्ववर्ती A<T1, T2, …, Tn>::fun(vs) है - ध्यान दें कि Ts विस्तार किया गया है - तो यह v1, v2, आदि प्रतिस्थापन vs में से A<T1, T2, …, Tn>::fun(v1), <T1, T2, …, Tn>::fun(v2), …, <T1, T2, …, Tn>::fun(vm) को विस्तार किया जाएगा।

+0

'Ts' और' vs' _can't_ की लंबाई भिन्न होती है। ऐसा लगता है कि अगर यह '5' एक से अधिक 'int' है तो यह संकलित नहीं होगा। –

+0

@MooingDuck: लंबाई केवल वही हैं क्योंकि फ़ंक्शन को 'टेम्पलेट शून्य मज़ेदार (टीएस ... बनाम)' घोषित किया गया है। क्या होगा यदि कोई अन्य टेम्पलेट <वर्ग ... टीएस, कक्षा ... हमें> शून्य iun (हमें ... बनाम) ': पी – kennytm

+0

@ केनीटीएम: टेम्पलेट पैरामीटर पैक अंतिम टेम्पलेट तर्क होना चाहिए अन्यथा इसे घटाया नहीं जा सकता या निर्दिष्ट (14.1.11)। –

4

केनीटीएम का जवाब सही है। मुझे बस नमूने पसंद हैं। लेकिन चूंकि उनका जवाब अमूर्त है, इसलिए मुझे लगता है कि उनके जवाब में डेमो जोड़ने की सही बात नहीं है। तो उनके जवाब के लिए डेमो यहाँ हैं। मुझे लगता है कि उसका जवाब सही है, मुझे कुछ भी नहीं पता है। (यदि आप इसे ऊपर उठाते हैं, तो उसे भी ऊपर उठाएं)

स्पष्ट रूप से यह सभी psudocode बस विस्तारित राज्य दिखा रहा है।

void foo<void*,int,char,std::string>(nullptr, 32, '7', "BANANA") { 
    //gun(A<Ts...>::hun(vs)...); 
    gun(A<void*,int,char,std::string>::hun(nullptr) 
     ,A<void*,int,char,std::string>::hun(32) 
     ,A<void*,int,char,std::string>::hun('7') 
     ,A<void*,int,char,std::string>::hun("BANANA") 
     ); 
    //gun(A<Ts...>::hun(vs...)); 
    gun(A<void*,int,char,std::string>::hun(nullptr, 32, '7', "BANANA"); 
    //gun(A<Ts>::hun(vs)...); 
    gun(A<void*>::hun(nullptr) 
     ,A<int>::hun(32), 
     ,A<char>::hun('7'), 
     ,A<std::string>::hun("BANANA") 
     ); 
} 
+1

ओह अरे! मुझे बस यह सवाल आया कि यह सवाल आया है! –

+2

विविधता वाले टेम्पलेट्स के साथ 'न्यूल' का उपयोग करना? यह ट्रेलर खींचने के लिए फेरारी का उपयोग करना है;) –

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