2015-02-18 7 views
5

मेरा शीर्षक मेरा मुख्य प्रश्न है। नीचे दिया गया कोड दिखाता है कि मैं क्या करना चाहता हूं, लेकिन यह एक त्रुटि का कारण बनता है।कैप्चर के साथ फ़ंक्शन में लैम्ब्डा कैसे पास करें?

class B 
{ 
public: 
    void DoSomething(void (*func)()) 
    { 
     func(); 
    } 
}; 

class A 
{ 
public: 
    int x; 
    void Start(B* b) 
    { 
     auto func = [this]()->void 
     { 
      this->x++; 
     }; 
     b->DoSomething(func); 
    } 
}; 

यदि मैं "यह" कीवर्ड हटा देता हूं, तो प्रोग्राम काम करता है, लेकिन फिर मैं एक्स चर का संदर्भ नहीं दे सकता।

तो मैं इसे कैसे प्राप्त कर सकता हूं?

+3

कोड और त्रुटियों पोस्ट करें। स्क्रीनशॉट खोजने योग्य नहीं हैं। – Pradhan

उत्तर

6

बदलें DoSomething

void DoSomething(std::function<void()> func) 

करने के लिए वर्तमान पैरामीटर void (*func)() एक सी शैली समारोह सूचक है कि कोई पैरामीटर स्वीकार करता है, जिसके कारण आपके चर this समारोह में पारित नहीं किया जा सकता है।

std::function<void()> हालांकि कुछ भी कॉल करने योग्य का प्रतिनिधित्व कर सकता है जो कोई पैरामीटर नहीं लेता है और कुछ भी नहीं देता है। यह एक कच्चा कार्य हो सकता है, या यह आपका लैम्ब्डा हो सकता है।

1

एक विकल्प है कि बड़े lambdas से जुड़े संभावित ओवरहेड से बचने के लिए टेम्पलेट का उपयोग करें, जिसे std :: function द्वारा पैक किया जाना आवश्यक है।

#include <functional> 

using namespace std; 

template<typename Callable> 
void DoSomething(Callable c) { c(); } // calls the lambda with no args 

int main() 
{ 
    DoSomething([]{ printf("Hello\n"); }); 
    DoSomething([msg = "World"] { printf("%s\n", msg); }); 
} 

लाइव कोड: http://goo.gl/LMvm3a

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