为什么我不能在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
。