2011-08-04 33 views
14

कॉल मैं ऐसा ही कुछ देख रहा हूँ:variadic टेम्पलेट पैरामीटर पैक समारोह के लिए विस्तार हो रहा

पैरामीटर पैक विस्तार एक और समारोह के अंदर किया जाता है
template< typename T> 
void func(T t) 
{ 
} 

template< typename... Parms> 
void anyFunc(Parms... p) 
{ 
    func<Parms>(p)... ; //error 
    func(p)... ;   //error 
} 

यदि यह फोन काम करता है:

template< typename T> 
int some(T t) 
{} 

template< typename... Parms> 
void func(Parms ...p) 
{} 

template< typename... Parms> 
void somemore(Parms... p) 
{ 
    func(some(p)...); 
} 

int main() 
{ 
somemore(1,2,3,4,10,8,7, "Hallo"); 
} 

पैरामीटर पैक विस्तार बेस क्लास प्रारंभकर्ताओं की एक सूची के लिए भी काम करेगा।

क्या कोई समाधान है जो कार्यों के लिए भी काम करेगा जो 'शून्य' वापस कर देगा। ऊपर दिए गए वर्कअराउंड, फ़ंक्शन कॉल का उपयोग करते समय पैरामीटर सूची के अंदर शून्य लौटने पर काम नहीं कर सका।

कोई भी विचार? जिन संदर्भों अल्पविराम सिर्फ एक वाक्यात्मक विभाजक, नहीं अल्पविराम ऑपरेटर है -

+0

Hacky समाधान अल्पविराम ऑपरेटर के साथ समारोह कॉल गठबंधन करने के लिए किया जाएगा (ताकि पैक विस्तार पैटर्न 'शून्य' उत्पन्न नहीं करता है) और किसी प्रकार का डमी फ़ंक्शन का उपयोग करें जो इसके तर्कों को "खाता है"। कुछ ऐसा [http://] [http://ideone.com/fFyPT)। संदेह यह है कि आप चाहते थे कि, हालांकि। :) – Vitus

उत्तर

8

दुर्भाग्य से, के रूप में आपने देखा, एक पैरामीटर पैक का विस्तार कुछ संदर्भों जहां पार्सर प्रविष्टियों की एक अल्पविराम से अलग किए उम्मीद में ही मान्य है। यह तर्कसंगत रूप से वर्तमान पाठ में कमी है।

एक बदसूरत वैकल्पिक हल:

func((some(p), 0)...); 

ध्यान दें कि समारोह तर्क के मूल्यांकन के क्रम, और इस तरह some आमंत्रण के आदेश, अनिर्दिष्ट है, तो आप कोई साइड इफेक्ट के साथ सावधान रहना होगा।

+0

प्रारंभिक सूची में पैक विस्तार का उपयोग कर सही क्रम में फ़ंक्शंस का मूल्यांकन करना आसान है। ध्यान दें: g ++ 4.8.1 में एक बग है और पीछे की ओर मूल्यांकन करता है! – Klaus

+0

', 0' का उद्देश्य क्या है? –

+3

@ पेरेगिंग-एलके: इलिप्सिस '(कुछ (पी), 0) के तहत अभिव्यक्ति करने के लिए' एक गैर-शून्य प्रकार है- यह आवश्यक है, क्योंकि आपको सहायक गैर-शून्य प्रकार की आवश्यकता है ताकि सहायक कार्य 'func '। – liori

5

कैसे एक छोटे से सहायक वर्ग के बारे में:

template <typename Func, typename A, typename ...Args> struct Caller 
{ 
    static void call(Func & f, A && a, Args && ...args) 
    { 
    f(std::forward<A>(a)); 
    Caller<Func, Args...>::call(f, args...); 
    } 
}; 

template <typename Func, typename A> struct Caller<Func, A> 
{ 
    static void call(Func & f, A && a) 
    { 
    f(std::forward<A>(a)); 
    } 
}; 

template <typename Func, typename ...Args> 
void Call(Func & f, Args && ...args) 
{ 
    Caller<Func, Args...>::call(f, std::forward<Args>(args)...); 
} 

तो फिर आप अपने ग्राहक कोड में निम्नलिखित रख सकते हैं:

void foo(A); 
Call(foo, a1, a2, a3); 
+0

@ डोलनॉर: फिक्स के लिए धन्यवाद। इतनी छोटी पोस्ट के लिए यह एक शानदार मात्रा में गलतियों थी: -एस –

+1

कोई समस्या नहीं। मुझे इसे प्रयोग करने के लिए काम करने की ज़रूरत थी, क्यों सुधार को साझा नहीं किया? ;) – Dolanor

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