Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

C++ Grundkurs

Einsatzgebiet von Lambda-Funktionen

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
C++ ermöglicht es, Lambda-Funktionen entweder in Variablen zu speichern oder diese als Argument sowie Rückgabewert einer Funktion zu verwenden.
06:57

Transkript

In dieser Lektion möchte ich Ihnen *Lambda*-Funktionen als First-Class-Objekte vorstellen. *Lambda*-Funktionen können in Variablen gespeichert werden, als Argument oder als Rückgabewert einer Funktion verwendet werden. Damit sind sie First-Class-Functions oder auch First-Class-Objekte. Das ist eine neue Technik in C++, die *Lambda*-Funktionen Einzug hält. Ich habe hier vier Beispiele dargestellt. Im ersten Beispiel sehen Sie eine *Lambda*-Funktion, die durch die eckigen Klammern eingeleitet wird. Die zwei Argumente a und b erwartet und als Ergebnis die zwei zusammenaddierten Werte zurückgibt. Die binde ich hier an eine Variable addTwoNumber. Sie sehen, *Lambda*-Funktion kann in einer Variablen gespeichert werden. Im zweiten Beispiel sehen Sie ein thread th. Das ist der Konstruktor eines threads, also eine spezielle Methode. Ich kann also eine *Lambda*-Funktion als Argument einer Funktion in diesem Fall des Konstruktors verwenden. std::sort ist eine neue Funktionalität in C++. Sobald Sie den thread initialisiert haben, läuft er automatisch los. Das heißt, in diesem Fall wird ein neuer sort gestartet und der würde ausgeben „Hello from thread“. Das dritte Beispiel bringt auch was Neues. Ich definiere eine Funktion makeAdd. Was macht die Funktion? Die gibt eine *Lambda*-Funktion zurück. Das ist die bekannte *Lambda*-Funktion, die zwei Argumente a, b annimmt und sie addiert. Was sie zurückgibt, das sehen Sie hier. Das ist hier der definierte Typ für ein allgemeines Funktionsobjekt. Ist auch etwas Neues in C++. Sie sehen hier auch in den eckigen Klammern, das ist die Signatur der Funktion, die ich zurückgebe. Die Funktion erwartet zwei ints und gibt ein int zurück. Diese zwei ints korrespondieren zu dem int hier und zu dem int hier. Das int hier korrespondiert zu dem Returntyp der *Lambda*-Funktion. Jetzt kann ich die Funktion makeAdd aufrufen. Die gibt mir eine *Lambda*-Funktion zurück und diesmal gebe ich der *Lambda*-Funktion den Namen myAdd und verwende aber diesmal std::function und nicht auto wie hier oben. Dann kann ich die *Lambda*-Funktion einfach aufrufen. Die Theorie will ich Ihnen jetzt gerne noch in der Praxis zeigen. Dazu wieder der Klassiker, die Funktion addTwoNumber, die eben zwei Zahlen addiert. Da gehe ich jetzt nicht mehr weiter darauf ein. Jetzt kommt etwas, auf das ich deutlich detaillierter eingehen muss. Ich definiere hier eine besondere Funktion. Die erkläre ich Ihnen jetzt. createUnaryAdd. Was ist createUnaryAdd? Das ist eine Funktion, die eine Funktion annimmt als Argument und eine Funktion zurückgibt. Das ist einmal das Erste. Was für eine Funktion nimmt sie an? Sie nimmt eine Funktion, die zwei ints erwartet und ein int zurückgibt. Sie gibt eine Funktion zurück, die ein int annimmt und ein int zurückgibt. D.h., aus der Funktion, die zwei ints annimmt und ein int zurückgibt, wird eine Funktion, die ein int annimmt und ein int zurückgibt. Wo macht sie das? Im Funktionskörper. Das hier ist eine *Lambda*-Funktion. Die *Lambda*-Funktion geht genau bis hier. Die *Lambda*-Funktion bindet sich an den aufrufenden Kontext mit func. Da ist das Argument, das die Funktion createUnaryAdd bekommt. Sie erwartet ein int. Was macht sie im Funktionskörper? Sie führt die Funktion aus, indem sie das erste Argument mit 2000 setzt und das zweite Argument als Variable freilässt. Jetzt habe ich extra ein kleines Päuschen gemacht. Jetzt sehen Sie noch einmal. Ich bekomme eine Funktion rein func, die zwei ints erwartet und ein int zurückgibt. Die verwende ich in der *Lambda*-Funktion hier, setze das erste Argument auf 2000 und lasse das zweite Argument offen. Das ist genau das, was die Funktion hier als Signatur verspricht. Ich gebe eine Funktion zurück, die nur ein int annimmt int sec. Das ist genau das int hier. Ein int zurück gibt eben func mit 2000 und sec ausgeführt. Jetzt zeige ich Ihnen die Funktion noch in der Anwendung. addTwoNumber (2000.11) da verwende ich die *Lambda*-Funktion von oben und setze die Werte ein 2000 und 11 und nicht verwunderlich kommt als Ergebnis 2011 raus. Jetzt wird es schon spannender. Jetzt rufe ich createUnaryAdd auf. createUnaryAdd erwartet eine Funktion, die zwei ints annimmt und ein int zurückgibt. Das tut genau addTwoNumber. Ich gebe also die Funktion der Funktion createUnaryAdd als Argument und bekomme eine Funktion addOneNumber, da createUnaryAdd das erste Argument mit 2000 bindet. Jetzt kann ich addOneNumber als Funktion verwenden. Aber addOneNumber braucht noch ein Argument, eben das zweite. In diesem Fall auch die 11. Ich zeige Ihnen das Ergebnis. Wenn ich die Funktion aufrufe, kommt auch 2011 raus. Aber diesmal auf eine andere Art und Weise. addOneNumber, sehen Sie hier, nimmt die 11 an und platziert sie sozusagen für dieses sec. Das ist meine ursprüngliche Funktion addTwoNumber teilweise evaluiert und das, was noch fehlt, das übergebe ich hier. Das Gleiche kann ich natürlich auch machen, indem ich keine Funktion übergebe, wie hier oben, sondern eine *Lambda*-Funktion hinschreibe, die der Syntax genügt. Das heißt, ich verwende eine *Lambda*-Funktion, die zwei ints annimmt und ein int zurückgibt. Ich füttere diese in die Funktion createUnaryAdd und die verdaut diese Funktion und liefert eine Funktion zurück, die ein int annimmt und ein int zurückgibt. Jetzt rufe ich sie wieder auf und diesmal auch wieder mit 11. Das Ergebnis ist das gleiche. Jetzt der letzte Fall, da mache ich das alles direkt. Bis hierher ist es das Gleiche wie in der vorhergehenden Zeile. Ich sage createUnaryAdd. Ich rufe createUnaryAdd mit der *Lambda*-Funktion auf, die zwei Argumente annimmt und einen Returnwert zurückgibt. Aber in diesem Fall rufe ich die Funktion gleich in place auf. Also was passiert hier? Hier übergebe ich eine *Lambda*-Funktion. Die kennen Sie. Diese *Lambda*-Funktion wird von dieser Funktion createUnaryAdd angenommen. Die *Lambda*-Funktion wird verarbeitet, verarbeitet, verarbeitet. Sie gibt eine *Lambda*-Funktion zurück genau hier an dieser Stelle. Das ist der Returnwert dieser Funktion. Diese *Lambda*-Funktion entspricht diesem Typ hier. Das heißt, das ist eine Funktion, die noch ein Argument erwartet, in diesem Fall sec und sie dann in die Funktion func füttert. Das eine Argument übergebe ich gleich hier. Damit kann ich die Funktion in place aufrufen. Sie sehen das gleiche Ergebnis. 2000 plus 11 ist natürlich auch 2011. In dieser Lektion habe ich Ihnen *Lambda*-Funktionen als First-Class-Objects oder auch First-Class-Functions vorgestellt. First-Class-Functions sind Functions, die Sie in Variablen speichern können, die Sie als Argument oder als Rückgabetyp einer Funktion verwenden können. Sie verhalten sich also wie Daten. Diese Technik ist eine neue Technik in C++, die mit *Lambda*-Funktionen Einzug gehalten hat und das ist eine sehr mächtige Technik, wie ich in dieser Lektion gezeigt habe.

C++ Grundkurs

Steigen Sie in die mächtige Programmiersprache C++ ein und lernen Sie dabei alle wichtigen Funktionen mit Anwendungsbeispielen kennen.

8 Std. 14 min (147 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!