如何声明函数向量(lambdas)

dmg*_*dmg 7 c++ c++11 c++14

我已经看到了如何声明一个函数向量(请参阅从向量中调用函数).

但那个答案是用户的指针.如何使用现代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表达式的类型(也是闭包对象的类型)是一个唯一的,未命名的非联合类类型

  • 另一个选择是使用函数指针,如果lambdas没有捕获. (5认同)

R S*_*ahu 7

实际的类型是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::vectorstd::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)