2013-08-11 11 views
5

Der Grund für Lambda-Ausdrücke besteht darin, implizit Funktionsobjekte auf "bequemere Weise" zu erzeugen. Wie Sie aus dem folgenden Beispiel sehen können, ist es nicht nur weniger bequem und länger, sondern hat auch eine verwirrende Syntax und Notation.Was ist der Vorteil von "Lambda-Ausdrücken"?

Gibt es irgendwelche Verwendungen von diesem, wo es tatsächlich Code lesbarer macht?

cout << count(vec, [&](int a){ return a < x; }) << endl; // lambda 
cout << count(vec, Less_than<int> (x)) << endl;   // normal functor def-n 
+3

Die Lambda-Version ist nicht mehr. Die Nicht-Lambda-Eins ist unvollständig, da wir nicht die Definition von "Less_than" haben. –

+0

Wie ist das 'Less_than (x)' eine "normale Funktionsdefinition" ??? Nach Ihrem ersten Beispiel sieht es so aus, als müssten Sie den Wert von "x" an einen Komparator mit zwei Parametern binden und diesen in einen Komparator mit einem einzigen Parameter umwandeln. Dies ist bereits eine Funktionalität, die weit über die "normale Funktionsdefinition" hinausgeht. – AnT

Antwort

10

Es ist besser lesbar, weil es die Implementierung der Funktion direkt in die Stelle platziert, wo sie genannt wird, so dass der natürlichen oben nach unten Fluss unverändert Code zu halten.

Sie sehen, normale Funktionen haben ihre Vor- und Nachteile. Auf der einen Seite helfen Funktionen, Wiederholungen im Code zu reduzieren, was den Code strukturierter und lesbarer macht. Auf der anderen Seite brechen Funktionen den natürlichen Codefluss und übertragen die Kontrolle an einen völlig anderen Ort. Dies kann die Lesbarkeit aus naheliegenden Gründen verringern: Es ist so, als würde man ein Buch lesen, das mit verschachtelten Vorwärts- und Rückwärtsreferenzen durchsetzt ist.

Um also die Eigenschaften gewöhnlicher Funktionen richtig auszunutzen, sollte man sie verwenden, um gut durchdachte, vollständige und isolierte Abstraktionen zu implementieren. Auf diese Weise verbessern normale Funktionen die Lesbarkeit des Codes.

Aber für kleine "Einweg" Einmal-Dienstprogramm-Code, funktionieren normale Funktionen nicht so gut. Sie können den Code tatsächlich deutlich weniger lesbar machen. Hier kommen Lambda-Funktionen ins Spiel. Sie ermöglichen es, den Wegwerf-Utility-Code direkt in den Punkt des Aufrufs zu injizieren, wo es notwendig ist.

+0

Ein weiterer Punkt ist, dass Lambda-Funktionen auf Variablen zugreifen können, die innerhalb des Geltungsbereichs im übergeordneten Kontext liegen (in diesem Fall könnte das Lambda bei Bedarf direkt auf "vec" zugreifen). Dies ist Teil des Nutzens von nicht mache eine separate Funktion. –

1

Der Lambda-Ausdruck existiert, um den Code zu vereinfachen. Dies:

auto fun = []() { return; }; 

mit vom Compiler ersetzt:

// Namespace scope 
struct __lambda_1 { 
    void operator()() { return; } 
}; 

// local scope 
__lambda_1 fun{}; 

Dies ist die primäre Motivation für die Lambda-Syntax: Um traditionelle Funktionsobjekte mit einem einfacheren zu ersetzen erklärte anonyme Funktion an der Stelle zu lesen, wo Es wird benötigt, anstatt ein separates Funktionsobjekt zu haben, das in einem anderen Bereich deklariert werden muss. Es soll nicht nur benannte Funktionsobjekte ersetzen.

In der Tat enthält die Standardbibliothek eine Reihe von benannten Funktionsobjekten wie std::unary_function und Dinge wie std::less. Diese Objekte haben jedoch einen begrenzten Nutzen und können nicht jede potentielle Rolle übernehmen, die ein Lambda hätte.

So, ja, es kann Code wesentlich lesbarer machen, indem er Code platziert, der die Standardbibliothek nicht genau dort bereitstellt, wo er benötigt wird, ohne deinen Code mit dutzend Zeilen struct s zu verschmutzen und deinen Namespace mit Namen zu beschmutzen ' Ich werde wahrscheinlich nicht mehr als ein- oder zweimal verwenden.

Verwandte Themen