examples - lambda expression c++ 11




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

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 es un tipo diferente. Debe usar std::tuple lugar de std::vector .


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; });

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






c++11