2013-08-11 20 views
5

Il motivo per le espressioni lambda è implicitamente generare oggetti funzione in un "modo più conveniente". Come puoi vedere dall'esempio seguente, non solo è meno conveniente e più lungo, ma ha anche una sintassi e una notazione confuse.Qual è il vantaggio delle "espressioni lambda"?

Ci sono degli usi di questo, dove effettivamente rende il codice più leggibile?

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

La versione lambda non è più lunga. Quello non-lambda è incompleto, poiché non abbiamo la definizione di 'Less_than'. –

+0

Com'è 'Less_than (x)' una "definizione di funzione normale" ??? A giudicare dal tuo primo esempio, sembra che tu debba associare il valore di 'x' a un funtore di comparazione a due parametri, convertendolo in un comparatore a parametro singolo. Questa è già una funzionalità che va ben oltre la "normale definizione della funzione". – AnT

risposta

10

E 'più leggibile perché pone l'implementazione della funzione destra nel punto dove viene chiamato, in modo da mantenere il flusso naturale top-to-bottom di codice invariato.

Vedete, le funzioni ordinarie hanno i loro pro e contro. Da un lato, le funzioni aiutano a ridurre le ripetizioni nel codice, rendendo il codice più strutturato e più leggibile. D'altra parte, le funzioni interrompono il flusso naturale del codice e trasferiscono il controllo in una posizione completamente diversa. Questo può ridurre la leggibilità per ragioni piuttosto ovvie: è come leggere un libro che è pieno di riferimenti avanti e indietro nidificati.

Quindi, per sfruttare correttamente le proprietà delle funzioni ordinarie, è necessario utilizzarle per implementare astrazioni ben pensate, complete e isolate. In questo modo le funzioni ordinarie miglioreranno la leggibilità del codice.

Ma per il piccolo codice di utilità monouso "usa e getta", le funzioni ordinarie non funzionano così bene. Possono effettivamente rendere il codice significativamente meno leggibile. È qui che entrano in gioco le funzioni lambda. Permettono di iniettare quel codice di utilità usa e getta direttamente nel punto della chiamata, dove è necessario.

+0

Un ulteriore punto è che le funzioni lambda possono accedere direttamente alle variabili che si trovano all'interno del contesto genitore (in questo caso, lambda potrebbe accedere direttamente a "vec" se necessario, ad esempio). Questo fa parte dell'utilità di non dover fare una funzione separata. –

1

Espressione lambda per semplificare il codice. Questo:

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

è sostituito dal compilatore con:

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

// local scope 
__lambda_1 fun{}; 

Questa è la motivazione principale per la sintassi lambda: Per sostituire gli oggetti funzione tradizionale con una più facile da leggere funzione anonima dichiarato nel sito in cui è necessario, piuttosto che avere un oggetto funzione separato che deve essere dichiarato in un altro ambito. Non si tratta semplicemente di sostituire gli oggetti funzione con nome.

Infatti, la libreria standard include un numero di oggetti funzione con nome come std::unary_function e cose come std::less. Ma questi oggetti hanno un'utilità limitata e non possono assumere ogni ruolo potenziale che un lambda farebbe.

Quindi, sì, può rendere il codice sostanzialmente più leggibile, inserendo il codice che la libreria standard non fornisce esattamente dove è richiesto, senza inquinare il codice con dozzine di righe struct e inquinando il proprio spazio dei nomi con i nomi che si ' probabilmente non usare più di una o due volte.

Problemi correlati