C ++ 11变量捕获与另一个lambda内的lambda

时间:2014-06-24 13:58:18

标签: c++ c++11 lambda

在node.js中我可以在lambda中编写lambda并捕获我想要的任何变量。但是在C ++ 11中,由于lambda函数实际上是functor对象,因此使用嵌套的lambdas进行变量捕获并不容易。

我正在使用[this]捕获此指针,以便我可以使用类成员。但是在lambda中,this指针指向lambda而不是outter类。

void MyClass::myFunction() {
    // call the lambda1
    connect(action, trigger, [this]() {
        // in the lambda1, call lambda2
        sendCommand([this]() {      // <-- I want `this` point to the outter class
            this->myMember.log("something");  // myMember is the member of class MyClass
        });
    });
}

我知道可以通过将其重命名为另一个指针变量并捕获该变量而不是this来完成,但我认为这种方式很难看。

有没有更好的方法可以捕捉到this

2 个答案:

答案 0 :(得分:3)

  

但是在lambda中,this指针指向lambda而不是outter类。

不,lambda this内部的值与外部相同。您的代码中唯一的问题是使用this而不是.访问->。这个计划:

void MyClass::myFunction() {
    std::cout << this << std::endl;
    // call the lambda1
    connect(action, trigger, [this]() {
        std::cout << this << std::endl;
        // in the lambda1, call lambda2
        sendCommand([this]() {      // <-- I want `this` point to the outter class
            std::cout << this << std::endl;
            this->myMember.log("something");  // myMember is the member of class MyClass
        });
    });
}

Prints the same value for this in all three places

g++ -std=c++11 -O3 -Wall -Wextra -pedantic -pthread main.cpp && ./a.out
0x7fff4286c80f
0x7fff4286c80f
0x7fff4286c80f

N3936(C ++ 14 Working Draft)[expr.prim.lambda] / 18州:

  

lambda-expression 复合语句中的每个 id-expression ,它是实体的odr-use(3.2)由副本捕获转换为对闭包类型的相应未命名数据成员的访问。 [注意: id-expression 不是odr-use,是指原始实体,永远不是闭包类型的成员。此外,这样的 id-expression 不会导致实体的隐式捕获。 - 结束注释]如果捕获this,则this的每个odr-use都会转换为对闭包类型的相应未命名数据成员的访问权限,强制转换(5.4)到this的类型。 [注意:强制转换可确保转换后的表达式为prvalue。 - 结束记录]

答案 1 :(得分:2)

您只需捕获外部lambda的上下文:

#include <iostream>

struct Omg
{
  int lol= 42;

  Omg()
  {
    [this]{ [&]{ std::cout<< this-> lol; }(); }();
  }
};

int main(){ Omg(); }