Lambdas可以从使用[=]
语法创建的上下文中捕获成员。我认为必须有一个状态引用存储在lambda中,类似于this
指针。
class Class
{
public:
void Function()
{
/*
* pass this lambda expression as parameter to another
* function and from there recover the this pointer which
* would be of the type Class* for further usage.
*/
[=](int)->int { /* do something with this->Member */ }
}
private:
int Member;
};
是否有办法从lambda表达式中获取引用指针?
不能,不能从lambda对象中恢复捕获的值或引用。
lambda类型没有公共数据成员,唯一的公共成员函数是函数调用操作符、构造函数、析构函数、赋值操作符,如果没有捕获任何内容,则转换为函数指针操作符。这些都不能用于提取捕获的实体。
补充Mike的回答:您实际上可以恢复存储在lambda中的任何信息…通过在调用时返回它(或将其存储在out-parameters中)。甚至可以捕获对lambda内部变量的引用,但要记住,该引用仅在lambda存在期间可用。
当然,这可能需要修改lambda的签名。
[=](int i) -> std::pair<int, X*> {
return std::make_pair(i, this);
}
[这]不是[=]。
为了进一步参考,我建议http://www.cprogramming.com/c + + 11/c++ 11-lambda-closures.html
目前我倾向于在大多数时间使用[&]作为捕获。它很便宜,通常lambda表达式足够短,所以这是安全的。