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

aik*_*khs 4 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;
    };
Run Code Online (Sandbox Code Playgroud)

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

小智 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();
}
Run Code Online (Sandbox Code Playgroud)


son*_*yao 5

您可以使用初始化程序(自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;
};
Run Code Online (Sandbox Code Playgroud)

请注意,我们只能捕获 lambda中的标识符,而不能this->_last_pose["main_pose"]直接捕获类似的表达式。将与初始化捕获只是解决这些问题简单。

  • @Edmund *因此,每当我们要在lambda中传递某个对象的变量时,都需要为此初始化一个新变量*替代方法将如何工作?在示例中指定的内容不仅仅是“对象的变量”,它是涉及对象的整个表达式。您不能只是将其放在捕获中,并且希望lambda的主体在lambda主体中找到时能够*识别*相同的任意表达式,然后自动将其转换为捕获的引用。特别是任意表达式在细微方面可能会有所不同。 (2认同)