我有一个基本的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打印序列.
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)
auto l = [](){
static int i = 0;
// ^^^^^^
cout << i++;
}
Run Code Online (Sandbox Code Playgroud)
应该解决你的顾虑.
通常,在不使用局部变量的情况下,函数不能保留内部状态static.实际上使用lambda没有区别.
如果要计算副本,可以使用普通的仿函数类实现,如@Revolver_Ocelot建议的那样.
| 归档时间: |
|
| 查看次数: |
1574 次 |
| 最近记录: |