Naw*_*waz 83 c++ lambda vector c++11
我试图创建一个lambda矢量,但失败了:
auto ignore = [&]() { return 10; }; //1
std::vector<decltype(ignore)> v; //2
v.push_back([&]() { return 100; }); //3
Run Code Online (Sandbox Code Playgroud)
错误:没有匹配函数来调用'std :: vector <main():: <lambda()>> :: push_back(main():: <lambda()>)'
我不想要一个函数指针向量或函数对象向量.但是,封装真实 lambda表达式的函数对象向量对我有用.这可能吗?
Pup*_*ppy 129
每个lambda都有不同的类型 - 即使它们具有相同的签名.您必须使用运行时封装容器,例如,std::function如果您想要执行类似的操作.
例如:
std::vector<std::function<int()>> functors;
functors.push_back([&] { return 100; });
functors.push_back([&] { return 10; });
Run Code Online (Sandbox Code Playgroud)
R. *_*des 39
所有lambda表达式都有不同的类型,即使它们是逐个字符的.你正在将一个不同类型的lambda(因为它是另一个表达式)推入向量中,这显然是行不通的.
一种解决方案是制作一个矢量std::function<int()>.
auto ignore = [&]() { return 10; };
std::vector<std::function<int()>> v;
v.push_back(ignore);
v.push_back([&]() { return 100; });
Run Code Online (Sandbox Code Playgroud)
另一方面,[&]当你没有捕捉任何东西时,使用它并不是一个好主意.
Luc*_*ton 17
虽然其他人所说的是相关的,但仍然可以声明和使用lambda的向量,尽管它不是很有用:
auto lambda = [] { return 10; };
std::vector<decltype(lambda)> vec;
vec.push_back(lambda);
Run Code Online (Sandbox Code Playgroud)
所以,你可以在那里存储任意数量的lambdas,只要它是复制/移动的lambda!
MSN*_*MSN 16
如果你的lambda是无状态的,即,[](...){...}C++ 11允许它降级为函数指针.理论上,符合C++ 11的编译器可以编译它:
auto ignore = []() { return 10; }; //1 note misssing & in []!
std::vector<int (*)()> v; //2
v.push_back([]() { return 100; }); //3
Run Code Online (Sandbox Code Playgroud)
您可以使用lambda生成函数(使用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++;
}
}
Run Code Online (Sandbox Code Playgroud)
但是我认为您现在基本上已经完成了自己的课程。否则,如果lambda具有完全不同的caputres / args等,则可能必须使用元组。