2012-12-19 40 views
18

संभव डुप्लिकेट:
Should templated functions take lambda arguments by value or by rvalue reference?मूल्य से या सी ++ 11 यूनिवर्सल संदर्भ द्वारा म्यूटर्स पास करें?

सी ++ मानक पुस्तकालय कार्यों इसलिए की तरह, मूल्य द्वारा functor (समारोह सूचक या समारोह वस्तु) तर्क ले:

template <typename F> 
void apply(F func) 
{ 
    func(); 
} 

.. लेकिन क्या Universal Reference द्वारा मकान मालिकों को पारित करना बेहतर नहीं होगा? इसलिए जैसा:

template <typename F> 
void apply(F&& func) 
{ 
    func(); 
} 

इस तरह आप समारोह वस्तुओं है कि राज्य को बनाए रखने के गुजर सकता है, और उच्च क्रम समारोह के बाद वापस आ गया है कि (संभवतः संशोधित) राज्य की पहुंच है।

+0

टेम्पलेट्स संकलित समय पर विस्तार/हल किए गए हैं। संकलन समय पर वे राज्य के बारे में कैसे जान सकते हैं? –

+2

ध्यान दें कि पहली बार आप प्रतिलिपि से बचने के लिए संदर्भ-रैपर का उपयोग कर सकते हैं। –

+0

@Manoj R: मेरा मतलब था: आपके पास फ़ंक्शन ऑब्जेक्ट वेरिएबल fn_obj है, आप लागू (fn_obj) पर कॉल करते हैं, और फिर आपके पास fn_obj.state तक पहुंच है, जिसे लागू करने के लिए कॉल द्वारा संशोधित किया गया हो सकता है – TommiT

उत्तर

7

यह पहले से ही कुछ एल्गोरिदम के मामले में है; उदाहरण के लिए, g++ 4.7.0 में:

//stl_algo.h 

template<typename _RandomAccessIterator, typename _UniformRandomNumberGenerator> 
void 
shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, 
    _UniformRandomNumberGenerator&& __g) 
{ 
    ... 
} 

जाहिर है, यह चीजों के लिए जरूरी इस तरह यादृच्छिक संख्या जनरेटर के रूप में है। मुझे लगता है कि यह समय में कुछ और आम हो जाएगा, हालांकि।