为什么我不能在C ++ 11中创build一个lambdas向量(相同types)?

我试图创build一个lambdavector,但失败了:

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

直到第二行,它编译好 。 但#3行给出编译错误 :

错误:调用'std :: vector <main():: lambda()>> push_back(main():: lambda()>'

我不想要一个函数指针向量或函数对象向量。 然而,封装真正的 lambdaexpression式的函数对象的向量,将为我工作。 这可能吗?

每个lambda都有不同的types – 即使它们具有相同的签名。 如果你想做类似的事情,你必须使用运行时封装的容器,如std::function

例如:

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

我不想要一个函数指针向量或函数对象向量。

那么,我想要一个有百人开发团队的高薪工作来发展我所有的梦想,但是这也不会发生。 你不能总是得到你想要的。

所有的lambdaexpression式都有不同的types, 即使它们是逐个字符也是一样的 。 你将一个不同types的lambda(因为它是另一个expression式)推入向量,这显然是行不通的。

一种解决方法是改为使用std::function<int()>的向量。

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

另一个说明,当你没有捕获任何东西时,使用[&]并不是一个好主意。

虽然其他人所说的是相关的,但是仍然可以声明和使用lambdavector,虽然它不是非常有用:

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

所以,你可以存储任意数量的lambdaexpression式,只要它是lambda的复制/移动即可!

如果你的lambda是无状态的,即[](...){...} ,C ++ 11允许它降级成一个函数指针。 从理论上讲,符合C ++ 11的编译器将能够编译这个:

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

你可以使用lambda生成函数(用Nawazbuild议的修正更新):

 #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++; } } 

但是我觉得你现在基本上是自己制作的。 否则,如果lambda具有完全不同的caputres /参数等,你可能不得不使用一个元组。

每个lambda是一个不同的types。 你必须使用std::tuple而不是std::vector