在C ++中多次调用同一个Lambda

时间:2018-10-11 20:32:44

标签: c++ lambda

lambda可以重用吗? 我想几次叫这个lambda。但是我找不到命名的方法。

[]() { cout << "lambda is called"; };

不调用这样的lambda的目的是什么?编译器不会对上面的代码大喊大叫,但是它没有用。我说的对吗?

5 个答案:

答案 0 :(得分:7)

您可以使用auto修饰符为其命名:

auto f = []() { cout << "lambda is called"; };

这将允许您使用f()来调用它。但是请记住,未指定lambda的类型,因此,如果要将其传递给函数,则需要使用模板(或转换为std::function<void()>)。

template <typename F>
void three_times(F g) {
    g(); g(); g();
}

答案 1 :(得分:6)

如果要重用lambda,则需要将其分配给变量。

auto lambda = []() { cout << "lambda is called"; };

为您提供了一个名为lambda的对象,您可以调用它operator ()来执行lambda的主体

lambda();

答案 2 :(得分:5)

是的,lamda可以重复使用。参见下面的例子

#include <iostream>
using namespace std;
template <typename F> void func2(F f) {
  f("func2");
}
void func(function<void(const char *)> f) {
  f("func");
}
int main() {
  auto l = [](const char *s) {
             cout << s << "\n";
           };
  for (int i = 0; i < 2; i++) {
    l("main"); // Calling lambda multiple times
    func(l);   // Passing lambda to a function using function<>
    func2(l);  // Passing lambda to a function using template
  }
  return 0;
}


Output:
main
func
func2
main
func
func2

答案 3 :(得分:4)

您可以通过将lambda分配给auto变量来轻松命名-就像这样;

const auto l = [] { whatever };

然后以l的身份多次呼叫l();

答案 4 :(得分:3)

使用自动存储lambda 或将其明确分配给兼容的std :: function:

auto f1 = [](int x, int y)->float{ ..... };
std::function<float(int,int)> f2 = [](int x, int y)->float{ ..... };
float x = f1(3,4);
auto y = f2(5,6);
std::function<float(int,int)> f3 = f1;