Ich habe kürzlich damit begonnen, Lambdas für den persönlichen Gebrauch zu erforschen. Ich habe seit einigen Jahren programmiert, ich habe mehrere Produkte in die Wildnis entlassen, und dennoch habe ich noch nie die Notwendigkeit, Lambdas zu verwenden. Ich habe die anderen Stack-Exchange-Antworten für verschiedene Lambda-Fragen gelesen, aber ich habe keine Erklärung gefunden, die ein tod-einfaches Beispiel zeigt, das wirklich die Idee antreibt, dass Lambdas notwendig sind (in manchen Situationen). Nach ein wenig Recherche bin ich nicht davon überzeugt, dass einige der spezifischen Verwendungen von Lambdas nicht mit Standardfunktionen implementiert werden können, was aber nicht viel bedeutet, da mein Umfang des Themas sehr begrenzt ist.
>Kann jemand einen ziemlich einfachen Anwendungsfall für Lambdas bereitstellen, der demonstriert, wie er leistungsfähiger sein kann als typische Funktionen (in den richtigen Situationen)?
C ++ war Turing abgeschlossen lange vor C ++ 11. Lambdas sind nicht dazu da, etwas Unmögliches zu einer Möglichkeit zu machen. Sie können viel ohne sie erreichen. Sie sind da, um bestimmte Teile des Codes zu straffen.
Zum Beispiel, um die Erstellung von Funktoren für die Standardalgorithmusbibliothek zu ermöglichen. Sicher kannst du eins selbst definieren. Dies erfordert jedoch, dass Sie Ihre Funktion verlassen und einen neuen Typ benennen müssen. Viele Beispiele für einen einfachen Aufruf von std::transform
als Beispiel.
Sie halten den Code lokalisiert, erfordern nicht, dass Sie irgendwelche Namensspitzen verschmutzen, und sind einfach zu benutzen, sobald Sie den Dreh raus haben.
Als Bonus reduziert Kevlin Henney in seinem Vortrag über funktionelles C ++ eine Beispielfunktion von einem Framework auf etwas, das wirklich schreit "benutze ein Lambda". Um sich etwas aus seinem Vortrag zu entlocken, sollten Sie eine Befehlsregistrierungsfunktion in Betracht ziehen:
%Vor%Sie möchten einen Befehl registrieren, der nur eine Glühbirne einschaltet. Wie viel Boilerplate müssten Sie für einen benutzerdefinierten Funktor schreiben, im Vergleich zu den folgenden?
%Vor%Denken Sie darüber nach, und welche Codebasis würden Sie lieber beibehalten.
Alles, was heutzutage mit lambdas möglich ist, könnte in C ++ 03 geschehen, indem man eine struct
/ class
mit einem überladenen operator()
(allgemein "functors" genannt) handgeschrieben hat . Es gab ein großes Problem damit: Mangel an Knappheit und Mangel an Lokalität .
Stellen Sie sich vor, Sie würden ein Template-Prädikat an etwas wie std::find_if
in C ++ 03 übergeben:
Sie müssen:
Definieren Sie predicate
irgendwo, möglicherweise weit entfernt von dem Ort, an dem es verwendet wird.
Haben Sie ein Muster für die struct
und die operator()
Überladung.
Springe während des Lesens im Quellcode herum, um zu verstehen, was predicate
macht.
Vergleichen Sie das mit einem allgemeinen C ++ 14 Lambda:
%Vor%Boom. Alles ist da, lokal, mit minimalen Standard.
Lambdas sind keine Zauberei. Sie sind rein syntaktischer Zucker . Aber ich bin meine Meinung, sie sind "syntaktischer Zucker zu handgeschriebenem struct
s" als "C ++ ist syntaktischer Zucker zu C" .
Sie verändern die Art, wie Sie Code schreiben, sie machen funktionale Paradigmen (z. B. Funktionen höherer Ordnung) praktikabel und können Ihren Code leistungsfähiger und sicherer machen.
Wir können fast alles ohne Lambdas machen. Lambdas werden jedoch eingeführt, um die funktionale Programmierung zu unterstützen, und sie sind in vielen Fällen nützlich.
Ich habe es kürzlich in Threads verwendet und es hat mein Leben leichter gemacht. Hier ist eine sehr vereinfachte Version
%Vor%Es gibt hier zwei offensichtliche Vorteile
Es gibt also wenige Fälle, wo Lambda eine bessere Option ist, aber das bedeutet nicht, dass wir das nicht mit Funktionen machen können