Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在类外定义lambda函数,并在C+中的类内使用它+;?_C++_Lambda - Fatal编程技术网

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()是一个相当长且复杂的线程过程。我可能会被降级为创建一个包含函数中所有数据的结构或类,但我试图避免它。