2010-05-12 8 views
68

मैं सिर्फ एक सामान्य ऑब्जेक्ट फैक्ट्री लिख रहा था और एक विविध टेम्पलेट बनाने के लिए बूस्ट प्रीप्रोसेसर मेटा-लाइब्रेरी का उपयोग कर रहा था (2010 का उपयोग करके और यह उनका समर्थन नहीं करता है)। मेरा फ़ंक्शन सही अग्रेषण करने के लिए रैवल संदर्भ और std::forward का उपयोग करता है और यह मुझे सोच रहा है ... जब C++ 0X आता है और मेरे पास मानक कंपाइलर था, तो मैं इसे वास्तविक वैरिएड टेम्पलेट्स के साथ करूँगा। हालांकि, क्या मैं तर्क पर std::forward पर कॉल करूंगा?किसी भिन्नता फ़ंक्शन में सभी तर्कों पर std :: आगे कैसे कॉल करेगा?

template <typename ...Params> 
void f(Params... params) // how do I say these are rvalue reference? 
{ 
    y(std::forward(...params)); //? - I doubt this would work. 
} 

एकमात्र तरीका जिसे मैं सोच सकता हूं उसे मैन्युअल अनपॅकिंग की आवश्यकता होगी ... पैरा और मैं अभी तक काफी कुछ नहीं हूं। क्या कोई तेज वाक्यविन्यास है जो काम करेगा?

उत्तर

103

आप करना होगा:

template <typename ...Params> 
void f(Params&&... params) 
{ 
    y(std::forward<Params>(params)...); 
} 

... काफी कहते हैं, "ले क्या बाईं तरफ है, और प्रत्येक टेम्पलेट पैरामीटर के लिए, यह तदनुसार खोल दे।"

+0

इसमें जोड़ें कि पैरामीटर कैसे पारित किए जाने चाहिए। मुझे लगता है कि ट्यूटोरियल 'शून्य एफ (पैराम्स और& ... पैराम्स' दिखाते हैं ' – UncleBens

+0

@Uncle: जोड़ा गया, मुझे लगता है कि आप सही हैं। – GManNickG

+58

समुद्री डाकू के दिन की तरह बात करते हुए मैं 'void f (Ar && ... arg) का उपयोग करता हूं। – woolstar

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