如何使用捕获子句从lambda获取状态引用



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表达式足够短,所以这是安全的。

最新更新