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.