smart - C++ Lambdas: lista de captura vs. lista de parámetros
smart contracts ethereum (2)
De acuerdo con el estándar de C ++ 11, las expresiones lambda pueden usar variables en el ámbito del envolvente, mediante la lista de captura, la lista de parámetros o ambos.
Por lo tanto, echemos un vistazo a dos versiones del mismo código.
1) Con captura
int x = 4;
cout << "With capture : Factorial of " << x << " = " << [x]() // <= Capture
{
int r = 1;
for (int i = x; i > 1; i--) r = r * i;
return r;
}() << endl;
2) Con parámetro
int x = 4;
cout << "With parameter: Factorial of " << x << " = " << [](int x) // <= Parameter
{
int r = 1;
for (int i = x; i > 1; i--) r = r * i;
return r;
}(x) << endl;
La salida es:
With capture : Factorial of 4 = 24
With parameter: Factorial of 4 = 24
Ya que podemos pasar parámetros a lambdas en la lista de parámetros (al igual que con cualquier función de C ++), ¿por qué necesitamos la lista de captura?
¿Alguien me puede mostrar casos donde la lista de parámetros no funciona y solo la lista de captura sí?
El punto es que con la captura, puede mantener un estado (como una clase escrita a mano con operador ()) en un objeto similar a una función. @dau_sama da una buena respuesta. Aquí hay otro ejemplo:
#include <iostream>
using namespace std;
int main() {
const auto addSome = [](double some){
return [some](double val){ return some+val; } ;
};
const auto addFive = addSome(5);
std::cout << addFive(2) << std::endl;
}
Por ejemplo utilizando algoritmos stl:
std::vector<int> items;
int factor;
auto foundItem = std::find_if(items.begin(), items.end(),
[&factor](int const& a)
{
return a * factor == 100;
});
En este caso, se llama a la lambda para cada elemento en el contenedor y se devuelve si el valor multiplicado por un factor capturado es 100. El código no tiene mucho sentido, solo es para mostrarle un ejemplo donde captura y parámetro las listas importan