examples c++ vector lambda c++11

lambda examples c++



¿Por qué no puedo crear un vector de lambdas(del mismo tipo) en C++ 11? (6)

Cada lambda es un tipo diferente. Debe usar std::tuple lugar de std::vector .

Estaba intentando crear un vector de lambda, pero fallé:

auto ignore = [&]() { return 10; }; //1 std::vector<decltype(ignore)> v; //2 v.push_back([&]() { return 100; }); //3

Hasta la línea 2, compila bien . Pero la línea # 3 da error de compilación :

error: no hay función de coincidencia para llamar a ''std :: vector <main () :: <lambda () >> :: push_back (main () :: <lambda ()>)''

No quiero un vector de punteros de función o vector de objetos de función. Sin embargo, el vector de objetos de función que encapsula expresiones lambda reales , me funcionaría. es posible?


Cada lambda tiene un tipo diferente, incluso si tienen la misma firma. Debe usar un contenedor de encapsulamiento en tiempo de ejecución como std::function si desea hacer algo como eso.

p.ej:

std::vector<std::function<int()>> functors; functors.push_back([&] { return 100; }); functors.push_back([&] { return 10; });


Mientras que lo que otros han dicho es relevante, aún es posible declarar y usar un vector de lambda, aunque no es muy útil:

auto lambda = [] { return 10; }; std::vector<decltype(lambda)> vector; vector.push_back(lambda);

Entonces, puedes almacenar cualquier cantidad de lambdas allí, ¡siempre que sea una copia / movimiento de lambda !


Puede usar una función generadora de lambda (actualizada con la corrección sugerida por Nawaz):

#include <vector> #include <iostream> int main() { auto lambda_gen = [] (int i) {return [i](int x){ return i*x;};} ; using my_lambda = decltype(lambda_gen(1)); std::vector<my_lambda> vec; for(int i = 0; i < 10; i++) vec.push_back(lambda_gen(i)); int i = 0; for (auto& lambda : vec){ std::cout << lambda(i) << std::endl; i++; } }

Pero creo que básicamente hiciste tu propia clase en este punto. De lo contrario, si las lambdas tienen caputres / args completamente diferentes, es probable que tengas que usar una tupla.


Si su lambda no tiene estado, es decir, [](...){...} , C ++ 11 le permite degradarse en un puntero de función. En teoría, un compilador compatible con C ++ 11 podría compilar esto:

auto ignore = []() { return 10; }; //1 note misssing & in []! std::vector<int (*)()> v; //2 v.push_back([]() { return 100; }); //3


Todas las expresiones lambda tienen un tipo diferente, incluso si son idénticas carácter por carácter . Estás presionando una lambda de un tipo diferente (porque es otra expresión) en el vector, y eso obviamente no funcionará.

Una solución es hacer un vector de std::function<int()> lugar.

auto ignore = [&]() { return 10; }; std::vector<std::function<int()>> v; v.push_back(ignore); v.push_back([&]() { return 100; });

En otra nota, no es una buena idea usar [&] cuando no estás capturando nada.