2012-12-19 10 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) 
{ 
    ... 
} 

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

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