如何在lambda中捕获此对象的变量?

时间:2019-05-23 07:23:29

标签: c++ lambda c++14

我在SO上看到了很多答案,询问通过引用捕获this的问题,但是我有一个不同的问题。如果我想捕获this对象拥有的特定变量怎么办?

例如:

auto rel_pose = [this->_last_pose["main_pose"],&pose](Eigen::VectorXd pose1, Eigen::VectorXd pose2)
    {
        // Some code
        return pose;
    };

我想按值捕获this的特定变量,并在我的lambda表达式中使用它。为什么这不可能呢?

3 个答案:

答案 0 :(得分:5)

可能:

struct S
{
    int i = 7;
    char c = 0;
};

int main(int argc, char* argv[])
{
    S s;
    auto l = [integer = s.i]() {
        return integer;
    };

    return l();
}

答案 1 :(得分:5)

您可以应用by-copy capture with an initializer(自C ++ 14起)(或使用初始化程序进行按引用捕获,具体取决于您的需求),例如

auto rel_pose = [some_pose = this->_last_pose["main_pose"], &pose](Eigen::VectorXd pose1, Eigen::VectorXd pose2)
{
    // Some code using some_pose
    return pose;
};

请注意,我们只能在lambda中使用capture个标识符,而不能直接捕获this->_last_pose["main_pose"]之类的表达式。 使用初始化程序捕获可以直接解决此类问题。

答案 2 :(得分:0)

  

为什么这不可能?

有可能,就像其他答案一样。但是您必须明确地这样做。访问lambda中当前对象的任何成员将自动转换为通过this指针的访问。当您编写普通的[this->_last_pose["main_pose"],&pose]时,真正捕获的内容是this,并且对_last_pose的访问也会通过它。

这就是为成员变量指定lambda捕获的方式。感谢您正在编译C ++ 14。在C ++ 11中,按值捕获成员并不像添加执行复制的init捕获那样容易。