2014-04-08 28 views
45

Wenn ich die Cocos2dx 3.0 API zu lesen war, habe ich so etwas wie dies gefunden:Was bedeutet "[das]" in C++ bedeutet

auto listener = [this](Event* event){ 
    auto keyboardEvent = static_cast<EventKeyboard*>(event); 
    if (keyboardEvent->_isPressed) 
    { 
     if (onKeyPressed != nullptr) 
      onKeyPressed(keyboardEvent->_keyCode, event); 
    } 
    else 
    { 
     if (onKeyReleased != nullptr) 
      onKeyReleased(keyboardEvent->_keyCode, event); 
    } 
}; 

Was bedeutet [this] bedeuten? Ist diese neue Syntax in C++11?

+12

Das ist ein Lambda, und Sie binden die aktuelle Instanz daran. – Zeta

+5

Es bedeutet, dass Sie 'this' erfassen. – rightfold

+1

Gibt es wirklich einen Punkt, um 'this' explizit zu erwähnen? Würde es nicht automatisch durch den Verweis auf "onKeyPressed" und "onKeyReleased" erfasst (vorausgesetzt, sie sind Mitglieder von 'this'). Auch eine Warnung, 'keyboardEvent', hält jetzt eine Kopie des 'this'-Zeigers ... wehe dir, wenn' keyboardEvent' es schafft, zu überleben, was auch immer' this' zeigt .... (Standard-Objekte lebenslange Ausgaben) –

Antwort

57

Was bedeutet [das]?

Es führt lambda - ein aufrufbares Funktionsobjekt. Setzen Sie this in die Klammern, bedeutet das, dass der Lambda this erfasst, so dass Mitglieder dieses Objekts in ihm verfügbar sind. Lambdas können auch lokale Variablen nach Wert oder Verweis erfassen, wie auf der verlinkten Seite beschrieben.

Die Lambda hat eine Überlastung der operator(), so dass es wie eine Funktion, die aufgerufen werden können:

Event * event = some_event(); 
listener(event); 

die den Code in den Körper des Lambda definiert ausgeführt wird.

Ist diese neue Syntax in C++ 11?

Ja.

+0

Ich möchte nicht PIA sein, und ich bin wirklich interessiert, wenn der Begriff "* overload of' operator() '*" hier technisch korrekt ist? Ich weiß, 'ClosureType' ist ein Typ und hat eine Memberfunktion' operator() ', aber ich denke, dass es an keiner Stelle überladen ist, oder? – luk32

+1

@ luk32 es überlädt den eingebauten Operator, genau so, wie es vom Benutzer deklariert wird. –

+0

Nun, ** ** wenn wir über einen Operator sprechen, der nur als Methode einer Klasse deklariert werden kann, ist er nicht "überladen", weil er für diese Klasse standardmäßig nicht definiert ist. Für Betreiber ist es jedoch allgemein akzeptiert zu sagen, dass sie "überlastet" sind, weil sie immer über irgend etwas Aufgerufenes gesagt wird, das bereits an anderer Stelle definiert ist. Im Ergebnis ist jede Operatordefinition "überladen". – Ethouris