如何从带有capture子句的lambda获取状态引用?

时间:2013-04-02 10:57:02

标签: c++ lambda closures this std

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表达式中获取引用指针?

3 个答案:

答案 0 :(得分:4)

不,您无法从lambda对象恢复捕获的值或引用。

lambda类型没有公共数据成员,唯一的公共成员函数是函数调用操作符,构造函数,析构函数,赋值运算符和转换为函数指针运算符(如果它没有捕获任何内容)。这些都不能用于提取捕获的实体。

答案 1 :(得分:2)

补充迈克的答案:你可以通过在调用时返回(或将其存储在out-parameters中)来实际恢复存储在lambda中的任何信息。甚至可以捕获对lambda中变量的引用,记住只要lambda存在,引用才可用。

当然,这可能需要改变lambda的签名。

[=](int i) -> std::pair<int, X*> {
    return std::make_pair(i, this);
}

答案 2 :(得分:0)

尝试[this]而不是[=]。

我建议进一步参考 http://www.cprogramming.com/c++11/c++11-lambda-closures.html

目前我倾向于在大多数时候使用[&amp;]作为捕获。它很便宜,通常lambda表达式足够短,所以这是安全的。