C++ 如何在类外定义lambda函数,并在C+中的类内使用它+;?
我想这样做:C++ 如何在类外定义lambda函数,并在C+中的类内使用它+;?,c++,lambda,C++,Lambda,我想这样做: // 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 us
// 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;
}
}
}
//定义要从某个类方法调用的lambda
自动状态_0_stuff=[&](){
.
调用方_data.some_func();lambda捕获声明点的状态
auto state_0_stuff = [&](){
lots_of_calcs_that_reference_caller_data();
.
caller_data.some_func();
.
}
在全局空间中,[&]
将仅捕获该空间中可用的内容。当您在函数中调用lambda时,它将使用捕获的状态,而不是函数的当前状态
您必须在函数中声明lambda,或者编写一个将状态传递给的函数/函子。您还可以将其设置为类的私有成员函数,以便它可以访问类状态,并且只需向其传递任何需要的函数本地状态
更深入地了解声明lambda时会发生什么:
当你这样做的时候
auto foo = [&](){ your code here };
编译将其扩展为以下内容(过于简化):
因此,您可以看到,我们在声明点创建了lambda对象,并且既然这样做了,它就可以使用它可能拥有的任何捕获变量进行初始化。您无法重新捕获变量,因为您无法再次调用其构造函数。lambda捕获声明点的状态。因此,当您
auto state_0_stuff = [&](){
lots_of_calcs_that_reference_caller_data();
.
caller_data.some_func();
.
}
在全局空间中,[&]
将仅捕获该空间中可用的内容。当您在函数中调用lambda时,它将使用捕获的状态,而不是函数的当前状态
您必须在函数中声明lambda,或者编写一个将状态传递给的函数/函子。您还可以将其设置为类的私有成员函数,以便它可以访问类状态,并且只需向其传递任何需要的函数本地状态
更深入地了解声明lambda时会发生什么:
当你这样做的时候
auto foo = [&](){ your code here };
编译将其扩展为以下内容(过于简化):
因此,您可以看到,我们在声明点创建了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;
}
}
}
否则,您可以使用重载的运算符()
创建结构,并在其构造函数中传递“捕获”。无法隐式捕获这些对象范围之外的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;
}
}
}
否则,您可以使用重载的操作符()创建结构
,并传递“捕获”在它的构造函数中。类或函数作用域之外的lambda基本上是一个函子,在lambdas;)之前就已经有了。顺便问一下,什么不起作用?如果你遇到编译器错误,你应该把它们包括在问题中。不,没有办法。你要么在函数中定义lambda,要么通过参数。您可以将lambda保存在类变量或帮助器结构中。您只能在定义位置捕获范围内的内容。用户…未定义的标识符..例如调用方\数据。某些\函数()类或函数作用域之外的lambda基本上是一个函子,这在lambdas;)之前是可能的。顺便说一句,什么不起作用?如果你遇到编译器错误,你应该把它们包括在问题中。不,没有办法。你要么在函数中定义lambda,要么通过参数传递你需要的一切。你可以e类变量或帮助器结构中的lambda您只能捕获定义位置范围内的内容。用户…未定义的标识符..例如调用方\数据。some \ func()。在我的示例中,some \ func()是一个相当长且复杂的线程过程。我可能会被降级为创建一个包含函数中所有数据的结构或类,但我试图避免它。在我的例子中,一些_func()是一个相当长且复杂的线程过程。我可能会被降级为创建一个包含函数中所有数据的结构或类,但我试图避免它。