2013-04-06 15 views
19

मैं लैम्ब्डा समारोह इस्तेमाल किया std::condition_variable प्रतीक्षा() फ़ंक्शन करने के लिए इसे पारित करने के लिए पारित करने के लिए है, लेकिन यह मामला नहीं है। मैं लैम्ब्डा फ़ंक्शंस का उपयोग करता हूं जो किसी भी पैरामीटर को प्राप्त नहीं करते हैं, और सबकुछ मेरे लिए बिल्कुल स्पष्ट है। लेकिन मैं पूरी तरह से समझ में नहीं आता कि कैसे लामडबा फ़ंक्शन का उपयोग किया जाता है जिसमें पैरामीटर सूची होती है। पैरामीटर के साथ लैम्ब्डा दिखाया जाता है? उन्हें पैरामीटर कैसे पास करें?सी ++ 11 लैम्ब्डा समारोह - कैसे पैरामीटर

+2

लैम्बडास पर आपको जो भी संसाधन मिलता है, वह समझाएगा कि कैसे मी पैरामीटर ले लो। – chris

+0

@chris मैं तो बनाने के पैरामीटर पर ध्यान देने HPW पता है - [] (पूर्णांक पैरामीटर) {लैम्ब्डा शरीर}, लेकिन इस कार्यक्रम मैं इस लैम्ब्डा प्रयोग करेंगे? – Littlebitter

+1

बस एक समारोह की तरह। – chris

उत्तर

24

मानकों के साथ लैम्ब्डा दिखाएँ उपयोग किया जाता है? उन्हें पैरामीटर कैसे पास करें?

यह बिल्कुल प्रतिदेय वस्तु के किसी भी अन्य प्रकार के साथ की तरह काम करता है:

#include <iostream> 

int main() 
{ 
    auto l = [] (int i) { std::cout << "The answer is " << i; }; 
    l(42); 
} 

यह भी ध्यान दें, कि आप यह आह्वान करने के लिए में एक चर में एक लैम्ब्डा स्टोर करने के लिए जरूरत नहीं है। निम्नलिखित उपरोक्त कार्यक्रम के पुनर्लेखन के लिए एक वैकल्पिक तरीका है:

#include <iostream> 

int main() 
{ 
    [] (int i) { std::cout << "The answer is " << i; } (42); 
    //             ^^^^ 
    //         Invoked immediately! 
} 

एक लैम्ब्डा समारोह (तथाकथित "लैम्ब्डा बंद") के प्रकार संकलक द्वारा परिभाषित किया गया है, और एक फोन ऑपरेटर जिसका साथ एक functor है हस्ताक्षर वह है जिसे आप लैम्ब्डा को परिभाषित करते समय निर्दिष्ट करते हैं। इसलिए, आप एक लैम्ब्डा वास्तव में फोन के रूप में आप एक functor फोन करता था (उदाहरण बिल्कुल के रूप में आप एक समारोह कहेंगे - या किसी प्रतिदेय वस्तु)।

इस प्रकार, यदि आप किसी ऑब्जेक्ट को लैम्ब्डा असाइन करना चाहते हैं, तो सबसे अच्छा अभ्यास है कि संकलक auto का उपयोग कर अपने प्रकार को कम करने दें। यदि आप नहीं चाहते या auto उपयोग नहीं कर सकते हैं, तो आप कर सकते हैं:

  1. गैर पर कब्जा करने के लिए lambdas उपयोग समारोह संकेत (कब्जा lambdas संकेत दिए गए कार्य करने के लिए परिवर्तनीय नहीं हैं)। ऊपर मामले में, इस प्रकार, निम्नलिखित भी काम करेगा:

    #include <iostream> 
    
    int main() 
    { 
        void (*f)(int) = [] (int i) { std::cout << "The answer is " << i; }; 
        f(42); 
    } 
    
  2. उपयोग std::function (यह भले ही लैम्ब्डा कैप्चर कर रहा है हमेशा संभव है,):

    #include <iostream> 
    #include <functional> 
    
    int main() 
    { 
        std::function<void(int)> f = [] (int i) 
               { std::cout << "The answer is " << i; }; 
        f(42); 
    } 
    
+4

मुझे प्यार है जब लोग जो समझा सकते हैं, यह सबके लिए आसान तरीका है :) धन्यवाद एंडी !! –

+0

@ जॉनी पॉलिंग: प्रशंसा के लिए धन्यवाद :) –

4
auto lambda = [] (int a, int b) { return a + b; }; 
assert(lambda(1, 2) == 3); 
+0

आह की मदद की! और यहां ऑटो int int (* पी) (int, int) छुपाता है? – Littlebitter

+0

lambdas के प्रकार @Littlebitter इसलिए आप की जरूरत 'auto' कार्यान्वयन से परिभाषित करता है। आप फ़ंक्शन पॉइंटर्स में कुछ लैम्ब्स (जो कुछ भी कैप्चर नहीं करते हैं) को परिवर्तित कर सकते हैं, लेकिन यह उनका वास्तविक प्रकार नहीं है (इसी प्रकार आप 'int' को 'long' में कैसे परिवर्तित कर सकते हैं, लेकिन 'int'' long')। –

+0

और अगर लैम्ब्डा [] हो जाएगा (int एक, int ख) -> पूर्णांक {वापसी ए + बी; }; ऑटो के बिना, वर्णित प्रकार के साथ फ़ंक्शन वैरिएबल को पॉइंटर बनाना संभव होगा? – Littlebitter

1

आप डॉन ' टी को अपने लैम्ब्डा को पकड़ने के लिए एक वैरिएबल की भी आवश्यकता है - आप इसे सीधे कॉल कर सकते हैं:

std::cout << [](int n) { return n + 1 ; } (99) << std::endl ; 
संबंधित मुद्दे