我已经看到了如何声明一个函数向量(请参阅从向量中调用函数).
但那个答案是用户的指针.如何使用现代C++中的新语法创建函数/ lambda的向量?
使用新语法的函数示例通常使用auto:
auto f = [] (std::string msg) -> void {
std::cout << msg << std::endl;
};
Run Code Online (Sandbox Code Playgroud)
f的实际类型是什么?所以我可以声明这种类型的向量?
非常感谢你的帮助
Sin*_*all 13
使用std::function
相应的类型:
std::vector<std::function<void(void)>> vec;
vec.push_back([]()->void{});
Run Code Online (Sandbox Code Playgroud)
在你的情况下,它会std::function<void(std::string)>
.
根据标准([expr.prim.lambda]/3),lambda的确切类型是没有意义的:
lambda表达式的类型(也是闭包对象的类型)是一个唯一的,未命名的非联合类类型
实际的类型是
f
什么?所以我可以声明这种类型的向量?
f
只能通过使用推断出类型auto
.您可以使用声明vector
此类型
std::vector<decltype(f)> v;
Run Code Online (Sandbox Code Playgroud)
但是,它不是很有用.看起来非常相似的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;
};
Run Code Online (Sandbox Code Playgroud)
鉴于以上功能,您无法使用
std::vector<decltype(f)> v;
v.push_back(f); // OK
v.push_back(g); // Not OK
v.push_back(h); // Not OK
Run Code Online (Sandbox Code Playgroud)
最好的选择是建立一个std::vector
的std::function
秒.您可以将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);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2852 次 |
最近记录: |