Skip to content

C++11 und C# Lambdas Teil 1

April 6, 2013

Eines der besten Features von C++11 sind Lambdas. Nach vielen Jahren keinerlei
Änderungen beim Syntax von C++ hat sich mit dem neuen Standard viel getan. In
diesem Blog Post erkläre ich die C++11 Lambdas im Vergleich zu C#.
Lancia Lambda

Einfache Lambdas

Starten wir mit einer einfachen Lambda Expression in C#:

Action l1 = () => Console.WriteLine("Hello, Lambda!");
l1();

Bei C# ist der Lambda Operator => wichtig. Links davon befinden sich die Parameter, rechts die Implementierung. Die Lambda Expression von diesem Beispiel hat keine Parameter, deshalb auch leere runde Klammern. Rechts in der Implementierung wird kein Wert zurückgeliefert. Deshalb passt beim Typ der Lambda Expression der delegate Action. Die Lambda Expression kann mit dem Syntax eines normalen Funktionsaufrufs erfolgen. Tatsächlich steckt ja auch eine Methode dahinter.

In C++11 sieht das ganze nicht so anders aus:

auto l1 = [] {
	std::cout << "hello, lambda" << std::endl;
};
l1();

Hier wird eine Lambda über [] erkannt. Nach den eckigen Klammern folgen geschwungene mit der Implementierung. Während es in C# bei Lambdas nicht möglich ist das var keyword für die Variablendeklation zu verwenden, geht das bei C++11. Das C++11 auto keyword ist ähnlich dem var in C#.

Bei C++11 kann die Lambda auch gleich direkt aufgerufen werden ohne vorher eine Variable deklarieren zu müssen:

[] {
	std::cout << "hello, lambda" << std::endl;
}();

Rückgabewerte

Soll eine Lambda einen Wert zurückliefern, muß in C# nur eine Variable deklariert werden die der Signatur und dem Rückgabewert der Lambda entspricht, und der Wert kann auch schon zurückgeliefert werden:

Func l2 = () => 42;
int x2 = l2();

Hier verwende ich eine Variable vom Typ Func für keine Argumente und einen int Return-Typ. Wenn die Lambda Expression aus einem einzigen Statement besteht ist es nicht notwendig ein return zu schreiben, und die geschwungenen Klammern können entfallen. In der langen Form sieht das dann so aus:

Func l2b = () => { return 42; };
int x2b = l2b();

Und jetzt das ganze in C++11:

auto l2 = [] {
	return 42;
};
int x2 = l2();

Deklaration des return-Typs ist hier nicht notwendig. Der Typ wird aus der Implementierung erkannt. Anders als in C# sind das return Statement und {} aber notwendig. Bei zukünftigen C++ Versionen könnte sich das aber auch noch ändern.
Bei C++11 ist die Deklaration des Return-Typs auch noch möglich:

auto l3 = []() -> int {
	return 42;
};
int x3 = l3();

Die Deklaration des Lambda-Typs kann mit dem neuen C++11 Syntax des trailing return types erfolgen. Mit diesem Syntax ist es auch notwendig die runden Klammern für die Eingabeparameter zu verwenden.

Bis auf kleine Syntax-Unterschiede sind die Lambdas bei C# und C++11 sehr ähnlich. Im zweiten Teil des Artikels geht es noch weiter mit Parameter und Captures, da finden sich dann auch [] und () im Einsatz.

Weitere Informationen zu C++11 bei meinem C++11 Workshop.

Christian
CN innovation
@christiannagel

Das Bild zeigt einen 1927 Red Lancia Lambda © Roberto Cerruti | Dreamstime.com

Schreibe einen Kommentar

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: