C++ Lambdas
Date: 2018-08-15Last modified: 2022-12-27
Table of contents
Funções de primeira classe
Em programação funcional funções são cidadães de primeira classe, o que significa que elas se comportam com dados e suportam quaisquer operações que a linguagem permita.
Algumas características das funções de primeira classe são:
- atribuir uma função a uma variável
- passar uma função como parâmetro para outra função
- retornar a função como valor de outra função
- armazenar a função em uma estrutura de dados
Lambdas
Lambdas são funções anônimas (sem um nome) definidas in-place.
// 1 2 3 4
[ ] ( ) { std::cout << "Hello from C++ Lambda!" << std::endl; } ( );
Vamos ver o que cada grupo significa:
- 1
[]
lambda introducer
oulambda closure
- 2
()
lista de parâmetros (você pode omitir estes parêntes se a função não receber parâmetros). - 3
{}
corpo da função lambda - 4
()
executa a função
Programação funcional com lambdas
// f(x,y) = x² + y² + 2xy;
std::function<int(int,int)> fxsquare = [](int x, int y) -> int {
int xsquare = [](int x) -> int { return x * x; }(x);
int ysquare = [](int y) -> int { return y * y; }(y);
int twoxy = [](int x, int y) -> int { return 2 * x * y; }(x,y);
return xsquare + ysquare + twoxy;
}
cout << fxsquare(5,3) << endl; // 64
Lambda capture
[var]
capturevar
by value[&var]
capturevar
by reference[=]
capture all by value[&]
capture all by reference[&, var]
capture all by reference, except capturevar
by value[&var, var2]
capturevar
by reference, andvar2
by value
int var = 42;
const auto add_by_value = [var](int x) -> int { return x + var; };
const auto add_by_ref = [&var](int x) -> int { return x + var; };
cout << add_by_value(10) << endl; // 52
cout << add_by_ref(10) << endl; // 52
☢
Warning
The previous value for variable var
was captured by
add_by_value
in its declaration and will not be updated.
var = 100;
cout << add_by_value(10) << endl; // 52
cout << add_by_ref(10) << endl; // 110
Polymorphic lambda
double n1 = 42;
float n2 = 42;
auto fp = [](const auto &n) -> auto { return n * 4; };
auto x1 = fp(n1);
auto x2 = fp(n2);
cout << "value of x1: " << x1 << " type of x1: " << typeid(x1).name() << endl;
cout << "value of x2: " << x2 << " type of x2: " << typeid(x2).name() << endl;
Possible output
52
52
52
110
value of x1: 168 type of x1: d
value of x2: 168 type of x2: f