如何声明功能向量(lambdas)
How to declare a vector of functions (lambdas)
我已经看到了如何声明函数向量(请参阅从向量调用函数)。
但是答案用户指示。如何使用现代C 中的新语法创建函数/lambdas的向量?
使用新语法的函数示例通常使用自动:
auto f = [] (std::string msg) -> void {
std::cout << msg << std::endl;
};
F的实际类型是什么?所以我可以声明这种类型的向量?
非常感谢您的任何帮助
与相应类型使用std::function
:
std::vector<std::function<void(void)>> vec;
vec.push_back([]()->void{});
在您的情况下,它将是std::function<void(std::string)>
。
lambda的确切类型是根据标准毫无意义的([Expr.prim.lambda]/3):
lambda-expression的类型(也是闭合对象的类型)是独特的,未命名的非工会类型
f
的实际类型是什么?所以我可以声明这种类型的向量?
f
的类型只能通过使用auto
来推导。您可以使用
vector
std::vector<decltype(f)> v;
但是,这不是很有用。看起来非常相似的Lambda函数具有不同的类型。更糟糕的是,具有相同体型的Lambda功能也具有不同的类型。
auto f = [] (std::string msg) -> void {
std::cout << msg << std::endl;
};
auto g = [] (std::string msg) -> void {
std::cout << msg << std::endl;
};
auto h = [] (std::string msg) -> void {
std::cout << msg << '+' << msg << std::endl;
};
给定上述功能,您不能使用
std::vector<decltype(f)> v;
v.push_back(f); // OK
v.push_back(g); // Not OK
v.push_back(h); // Not OK
您最好的选择是创建std::function
s的std::vector
。您可以将lambda功能添加到该std::vector
。给定上述f
和g
的定义,您可以使用:
std::vector<std::function<void(std::string)>> v;
v.push_back(f);
v.push_back(g);
v.push_back(h);
如所述,您声明的每个lambda都具有独特的上下文类型,即使它具有相同的签名。这就是为什么lambdas的矢量只有理论价值 - 您最多能够将其推到一个lambda ...您有两种选择 - 您可以从其他答案中使用建议的方法,然后将lambdas存储到类型的 std::function
中。将它们放入向量或将您的lambdas放入一个"容器"中,该"容器"将收集每个元素的类型,除了lambda对象本身-std::tuple
:
auto t = std::make_tuple([](){ std::cout<<"First lambda" << std::endl; },
[](){ std::cout<<"Second lambda"<< std::endl; },
[](){ std::cout<<"Third lambda" << std::endl; });
并在编译时获得适当的lambda:
std::get<0>(t)(); // the value in get must be known at compile time!
// otherwise compiler won't be able to establish type
// of lambda and the whole point of using tuple is lost
[live demo]
- C++模板功能检查唯一向量
- 分割错误:向量中的擦除功能
- 迭代向量以获得搜索功能
- 基于不同字段的对象向量的排序功能
- 如何使用指针向量为班级制作复制功能
- 如何在不复制的情况下将向量向量从类函数传递到功能
- 将功能参数添加到向量
- 使用ENABLE_IF和SFINAE时,功能参数类型扣除(std容器,例如向量)失败
- 向量擦除功能无法正常工作
- (C )创建可以从功能访问的动态全局数组/向量
- STD功能替换向量中的字节范围
- 定义功能,以便它可以接受列表或向量
- 如何管理STD ::功能的STD ::向量
- 当程序输入主要功能时,为什么要清除此std ::向量
- 有没有办法将向量从辅助函数传递到C 中的另一个辅助功能
- 从功能返回时,向量的深拷贝行为
- 初始化功能指针的向量
- 字符串向量不传递到类功能
- 如何声明功能向量(lambdas)
- 如何创建<wchar_t>具有擦除(size_t pos)方法的功能向量?