C++ lambdas如何/可以保留内部状态?

val*_*val 7 c++ lambda

我有一个基本的lambda,看起来像这样:

auto l = [](){
  int i = 0;
  cout << i++;
}
Run Code Online (Sandbox Code Playgroud)

多次打电话,将继续打印0.如何保留我?我可以不用仿函数吗?

Hiu*_*ura 14

根据您对此lambda的处理方式,您可以考虑以下替代方法:

auto exec = [i = 0]() mutable { cout << ++i << ' '; };
exec();  // 1
exec();  // 2
auto exec2 = exec; // copy state of lambda
exec2(); // 3
exec();  // 3
Run Code Online (Sandbox Code Playgroud)

[]() { static int i = 0; cout << ++i << ' '; };相反,使用将导致1 2 3 4打印序列.

实例

  • 请注意:必需的C++ 14. (4认同)

Mar*_*sse 13

试着把lambda想象成一个带有的类operator().你如何在课堂上保留国家?有一个成员.捕获在这里是等价的.

#include <iostream>
auto l = [i=0]()mutable{
  std::cout << i++;
};
auto l2=l;
int main(){
  l(); // 0
  l(); // 1
  l(); // 2
  l2(); // 0
  l2(); // 1
  l(); // 3
  std::cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)


πάν*_*ῥεῖ 5

 auto l = [](){
   static int i = 0;
// ^^^^^^
   cout << i++;
 }
Run Code Online (Sandbox Code Playgroud)

应该解决你的顾虑.

通常,在不使用局部变量的情况下,函数不能保留内部状态static.实际上使用lambda没有区别.


如果要计算副本,可以使用普通的仿函数类实现,如@Revolver_Ocelot建议的那样.

  • @val 如果你希望每个副本都有自己的值,你应该自己编写有状态函子(lambda 实际上只是一个语法糖)。 (2认同)