tutorial smart remix programador online español curso c++ c++11 lambda

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