lambda-Funktionen
Ein Feature, auf das viele C++-Programmierer lang gewartet haben: lambda-Funktionen (manchmal auch: Closures) ermöglichen
die schnelle und unkomplizierte Definitionen von Funktionobjekten direkt vor Ort. Man kann sie als Parameter für eine andere
Funktion übergeben (wie in unserem Beispiel mit std::sort
), in einer Variable speichern und später aufrufen. Hervorragend
geeignet für kurze Callback-Funktionen, die bspw. zwei Objekte vergleichen.
Video
Code
|
|
Erklärung
Das eigentlich interessante ist nur eine Zeile: Zeile 25 ist unsere lambda-Funktion. Eingeleitet durch []
(der sogenannten
“capture specification”. Was das genau alles tun kann, dazu später mehr.), folgt danach eine Parameterliste wie bei einer
normalen Funktion. Unsere hier nimmt also zwei Parameter jeweils vom Typ Wrapper const &
. In den geschweiften Klammer
danach steht der Funktionsbody. Der ist hier recht kurz. Schließlich soll die Funktion nur anhand der eingebetteten Werte
die Frage beantworten, welcher von den beiden Wrappern bei der Sortierung zuerst kommt. Ergebnis dieser Zeile ist ein Objekt,
welches laut C++ einen komplett eigenen Typ repräsentiert und sich verhält, wie ein Funktionsobjekt (so wird’s dann im
allgemeinen auch implementiert sein).
Was auffällt: obwohl wir hier eine Funktion haben und diese ja üblicherweise einen Rückgabetyp angeben, fehlt die
entsprechende Information hier. Das ist so gewollt: wenn der Compiler den Rückgabetyp ableiten kann, dann tut er das für
lambda-Funktionen auch. Hier kann er das: die Rückgabe ist das Ergebnis des operator<
im return-Statement der Funktion.
Damit ist klar, dass der Rückgabetyp sinnigerweise nur bool
sein kann. Das leitet der Compiler erfolgreich selbst ab und
belästigt uns daher nicht mit der Frage.
Für alle, die’s noch etwas umfassende wollen und Englisch können: Alex Allain zum Thema lambda-Funktionen.