我想做这样的事情:
// define a lambda to be called from some class method
auto state_0_stuff = [&](){
.
caller_data.some_func(); <-- identifier undefined compiler error
.
}
// call the lambda from some class method, capturing the data and using in the lambda.
void foo::some_func(){
int state = 0;
bool done = false;
// more data...
bar caller_data;
while(!done){
switch(state){
case 0:
state_0_stuff(); <-- instead of adding lots of code here, call lambda
state = 1;
break;
case 1:
done = true;
break;
}
}
}
如果我在foo :: some_func主体中定义lambda,这将起作用,但是如果我尝试在外部定义lambda,则将不起作用。
有一些相对简单的语法可以达到这种效果吗?
我不在乎是否使用lambda,这只是我的第一个想法。目的是简化switch(state)的内容,以使代码比在情况下添加50行内容时更具可读性。
显然,我可以使用普通的函数,并来回传递一堆东西,但是如果像Lambda那样仅由函数捕获本地状态,则复杂得多。
无法隐式捕获Lambda中超出对象范围的对象。您需要明确地传递它们。
作为解决方案,您可以向其中添加private
成员函数foo
并调用它:
void foo::case0(bar& caller_data, /* ... */)
{
lots_of_calcs_that_reference_caller_data();
.
caller_data.some_func();
.
}
void foo::some_func(){
int state = 0;
bool done = false;
// more data...
bar caller_data;
while(!done){
switch(state){
case 0:
case0(caller_data, /* ... */);
state = 1;
break;
case 1:
done = true;
break;
}
}
}
否则,您可以创建一个struct
带有重载的,operator()
并在其构造函数中传递“捕获”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句