2013-04-06 45 views
19

Ho usato la funzione lambda per passarla alla funzione std::condition_variable wait(), ma non è questo il caso. Uso le funzioni lambda che non ricevono alcun parametro e tutto è assolutamente chiaro per me. Ma non capisco assolutamente come viene usata la funzione lamdba che ha la lista dei parametri. Mostra lambda con parametri usati? Come passare parametri a loro?Funzione C++ 11 lambda - come passare il parametro

+2

Qualsiasi risorsa che trovi su lambda spiegherà come fare m prendere parametri. – chris

+0

@chris So che hpw deve quindi prendere i parametri - [] (parametro int) {corpo lambda}, ma show userò questo lambda? – Littlebitter

+1

Proprio come una funzione. – chris

risposta

24

Visualizza lambda con i parametri vengono utilizzati? Come passare parametri a loro?

Funziona esattamente come con qualsiasi altro tipo di oggetto callable:

#include <iostream> 

int main() 
{ 
    auto l = [] (int i) { std::cout << "The answer is " << i; }; 
    l(42); 
} 

Notare inoltre, che non è necessario memorizzare una lambda in una variabile al fine di invocarlo. Quanto segue è un modo alternativo per riscrivere il programma sopra:

#include <iostream> 

int main() 
{ 
    [] (int i) { std::cout << "The answer is " << i; } (42); 
    //             ^^^^ 
    //         Invoked immediately! 
} 

il tipo di una funzione lambda (la cosiddetta "chiusura lambda") è definita dal compilatore, ed è un funtore con un operatore del call cui la firma è quella che specifichi quando definisci il lambda. Pertanto, si chiama un lambda esattamente come si chiamerebbe un funtore (cioè esattamente come si chiamerebbe una funzione - o qualsiasi oggetto callable).

Pertanto, se si desidera assegnare un lambda a un oggetto, è consigliabile lasciare che il compilatore ne deduca il tipo utilizzando auto. Se non si vuole o non può utilizzare auto, allora si può:

  1. puntatori utilizzare la funzione per lambda non cattura (lambda cattura sono non convertibile di funzionare puntatori). Nel caso di cui sopra, in tal modo, il seguente funziona anche:

    #include <iostream> 
    
    int main() 
    { 
        void (*f)(int) = [] (int i) { std::cout << "The answer is " << i; }; 
        f(42); 
    } 
    
  2. Usa std::function (questo è sempre possibile, anche se la lambda sta catturando):

    #include <iostream> 
    #include <functional> 
    
    int main() 
    { 
        std::function<void(int)> f = [] (int i) 
               { std::cout << "The answer is " << i; }; 
        f(42); 
    } 
    
+4

Amo quando le persone che possono spiegare lo fanno nel modo più semplice per tutti :) Grazie Andy !! –

+0

@JohnnyPauling: Grazie per l'apprezzamento :) –

4
auto lambda = [] (int a, int b) { return a + b; }; 
assert(lambda(1, 2) == 3); 
+0

ahha! e qui auto nasconde int (* p) (int, int)? – Littlebitter

+0

@Littlebitter il tipo di lambda è definito dall'implementazione, quindi è necessario 'auto'. Puoi convertire alcuni lambda (quelli che non catturano nulla) in puntatori di funzioni, ma questo non è il loro tipo effettivo (simile a come puoi convertire un 'int' in un' long', ma un 'int' non è un' long'). –

+0

e se lambda sarà [] (int a, int b) -> int {return a + b; }; sarà possibile creare un puntatore alla variabile di funzione con il tipo I descritto, senza auto? – Littlebitter

1

È don' C'è anche bisogno di una variabile per tenere il tuo lambda - puoi chiamarlo direttamente:

std::cout << [](int n) { return n + 1 ; } (99) << std::endl ; 
Problemi correlati