如何声明功能向量(lambdas)

How to declare a vector of functions (lambdas)

本文关键字:功能 向量 lambdas 声明 何声明      更新时间:2023-10-16

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

但是答案用户指示。如何使用现代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。给定上述fg的定义,您可以使用:

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]