2016-06-18 12 views
0

Dies könnte eine ziemlich nooby Frage sein, aber ich war nicht in der Lage, es selbst herauszufinden.Zugriff auf externen Kontext innerhalb von Lambdas

Also, ich versuche, eine Lambda in die folgende Funktion zu übergeben:

wiringPiISR(int pin, int mode, void (*function)()) 

... was ergibt:

wiringPiISR(Pin::BELL, INT_EDGE_RISING, [] {}); 

... und scheint zu funktionieren, so dass ich Offensichtlich kann ein Lambda verwendet werden, anstatt auf eine Funktion zu zeigen.

Aber was ich will eigentlich zu tun ist, so etwas wie das, mit this Erfassung der Funktion onInterrupt(Pin pin) im äußeren Kontext:

wiringPiISR(Pin::BELL_1, INT_EDGE_RISING, [this] { 
    onInterrupt(Pin::BELL_1); 
}); 

wiringPiISR(Pin::BELL_2, INT_EDGE_RISING, [this] { 
    onInterrupt(Pin::BELL_2); 
}); 

... was in dieser Fehlermeldung führt:

No matching function for call to wiringPiISR 

Ich bin nicht sehr erfahren in der Verwendung von C++ - Lambda, ich kenne Schließungen aus vielen anderen Sprachen, aber sie scheinen offensichtlich in C++ anders zu arbeiten. Diese Erfassung scheint die Signatur des Abschlusses zu modifizieren, aber ich habe keine Ahnung, wie ich das beheben kann oder ob es eine mögliche Lösung gibt, ohne auf eine "tatsächliche" Funktion zu zeigen.

Vielen Dank im Voraus

+0

Ich nehme an, onInterrupt ist ein Mitglied. Daher schlage ich vor, dass Sie 'this-> onInterrupt (...)' versuchen. Ich habe ähnliches Verhalten gesehen, wo der Compiler es nicht kompilieren konnte ohne explizite 'this->'. –

+0

Nein, das ändert nichts, ich habe das schon probiert. Es sieht so aus, als ob die 'wiringPiISR' diese Schließung nicht akzeptiert, wenn ich die Fehlermeldung richtig interpretiere. – andreaspfurtscheller

+0

Entschuldigung, habe den Funktionszeiger nicht innerhalb des ersten gelesen. Dies ändert die Dinge ein bisschen (wird tatsächlich eine Antwort geben). –

Antwort

2

C++ lambdas sind nur umwandelbar Zeiger funktionieren, wenn es kein Capture ist (und Sie erfassen this wie angegeben).

Auch beziehen sich auf die draft C++11 standard Abschnitt 5.1.2:

Die Verschlusstyp für eine Lambda-Ausdruck ohne Lambda-Capture hat eine öffentliche nicht-virtuelle nicht-explizite const Konvertierungsfunktion auf Zeiger zu funktionieren mit den gleichen Parameter und Rückgabetypen wie die Schließung Typ Funktionsaufruf Operator.

Als Lösung könnten Sie anstelle des Funktionszeigers std::function verwenden.

Verwandte Themen