एक वैरिएबल फंक्शन में सभी तर्कों पर कोई व्यक्ति std :: को कैसे कॉल करेगा?


115

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

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

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

जवाबों:


162

तुम करोगे:

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

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


1
इसमें जोड़ें कि मापदंडों को कैसे पारित किया जाना चाहिए। मुझे लगता है कि ट्यूटोरियल शोvoid f(Params&& ...params)
अंकल

87
एक समुद्री डाकू दिन की तरह बात करने पर, मैं उपयोग करता हूंvoid f(Ar&& ...arg)
वूलस्टार

कृपया rvalue reference && (विकल्प के बजाय संदर्भ या केवल स्थिति के आधार पर मूल्य) के विकल्प की प्रेरणा स्पष्ट करें
DavidJ

@DavidJ मैंने सवाल में पके हुए के रूप में प्रेरणा ली है। हालाँकि देखें: stackoverflow.com/questions/3582001/
नुकसान-of
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.