Como usar lambda em C++

Lambda é um recurso do C++11 para trazer um pouco mais do paradigma funcional para linguagem, mas basicamente é um recurso de implementação de método sem a necessidade de declaração.

Exemplo de declaração de um método “sum”, com e sem lambda.


// Sem Lambda
#include ‹iostream›
// declaracao
int sum(int,int);

// implementacao
int sum(int left, int right){
   return left + right;
}

int main() {

// execução
// output: 20
std::cout ‹‹ sum(10,10) ‹‹ std::endl;
system("pause");

return 0;
}
[/code]

[code language="cpp"]

// Com lambda
#include ‹iostream›
#include ‹functional›

int main() {

// declaracao e implementacao
std::function sum = [](int left, int right) {
    return left + right;
}

// execução
// output: 20
std::cout ‹‹ sum(10,10) ‹‹ std::endl;
system("pause");

return 0;

}

Vamos entender cada ponto da sintaxe do lambda:

IC251606

1 – Quando você precisa de acesso a variáveis externas ao lambda. Exemplo abaixo:

// Com lambda
#include ‹iostream›
#include ‹functional›

int main() {

int middle = 10;

// passando a referencia da variável "middle" como capture.
std::function sum = [&middle](int left, int right) {
   // usando variavel middle
   return left + middle + right;
}

// output: 30
std::cout ‹‹ sum(10,10) ‹‹ std::endl;
system("pause");

return 0;

}

2 – Parâmetros de entrada.

#include ‹iostream›
#include ‹functional›

int main() {

// mudando parâmetros de entrada do método
std::function sum = [](double left, double right) {
return left + right;
}

// output: 30
std::cout ‹‹ sum(10,10) ‹‹ std::endl;
system("pause");

return 0;
}

3 – Mutable é uma sintaxe opcional, que permite alteração do valor das variáveis sem afetar o valor externo dela. Exemplo abaixo:

#include ‹iostream›
#include ‹functional›

int main() {
int n = 0;
int m = 0;
std::function fx = [&,n](int i) mutable {
    m = ++n + i;
}
// execução
fx(4);
// output: 5 - 0
// como a variável 'n' foi passada como cópia não alterou o valor externo
std::cout ‹‹ m ‹‹ " - " ‹‹ n ‹‹ std::endl;
system("pause");

return 0;
}

4 – Caso exista o tratamento de exceção na execução do lambda

5 – Retorno do lambda, deve seguir a sintaxe exemplificada na imagem acima.

6 – Escopo da função

Links de Referência

https://msdn.microsoft.com/pt-BR/library/dd293608.aspx

https://pt.cppreference.com/w/cpp/language/lambda

Tem alguma dúvida ou sugestão? Deixe nos comentários!

Deixe um comentário