在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
?
答案 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(); }