2015-02-18 7 views
5

Mein Titel ist meine Hauptfrage. Der folgende Code zeigt, was ich tun möchte, aber es verursacht einen Fehler.Wie ein Lambda in einer Funktion mit einem Capture übergeben?

Wenn ich das Schlüsselwort "this" entferne, dann funktioniert das Programm, aber dann kann ich die Variable x nicht referenzieren.

Wie kann ich das erreichen?

+3

Bitte senden Sie den Code und Fehler. Screenshots können nicht durchsucht werden. – Pradhan

Antwort

6

ändern DoSomething zu

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

Der aktuelle Parameter void (*func)() ist ein Funktionszeiger C-Stil, der keine Parameter akzeptiert, weshalb Ihre Variable this nicht in die Funktion übergeben werden kann.

std::function<void()> jedoch kann alles aufrufbar, dass keine Parameter und nichts zurückgibt. Es könnte eine rohe Funktion sein, oder es könnte Ihr Lambda sein.

1

Eine Alternative besteht darin, einfach Vorlagen zu verwenden, um den potenziellen Overhead zu vermeiden, der mit großen lambdas verbunden ist, die von std :: function gepackt werden müssen.

#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); }); 
} 

Live-Code: http://goo.gl/LMvm3a

Verwandte Themen