C++ - Lambda表达式、捕获子句和类成员

8
我正在使用PPL和parallel_for语法来进行for循环。在捕获子句中,我有3个变量,其中一个是类成员。由于捕获子句中存在类成员变量,因此会出现编译错误。然而,如果将该类成员变量放在lambda主体中,也无法编译,错误说明封闭范围内的变量应该在捕获子句中。应该如何继续?我是否应该先将变量成员复制到本地变量中,然后将其传递到捕获子句中? 以下是代码,其中formulaCommand是类成员:
parallel_for (m_rowStart,m_rowEnd+1,[&functionEvaluation,varModel_,formulaCommand](int i)
    {       
            MLEquationVariableModel  model_(varModel_);
            model_.addVariable("i", i);
            model_.addVariable("j", 1);
            MLEquationCommand* command_ = formulaCommand->duplicate(&model_);
            double d = command_->execute().toDouble();
            if(d==NO_VALUE)
            {
                functionEvaluation.local()  = NO_VALUE;
            }
            else
            {
                functionEvaluation.local() += d;
            }
            delete command_;
    });

谢谢!

1个回答

7

为了访问成员变量,您需要捕获this(记住formulaCommand相当于this->formulaCommand)。

[&functionEvaluation, varModel_, this](int i) { ... }

(顺便说一句,你最好使用智能指针(unique_ptr<MLEquationCommand>)而不是手动删除原始指针command_。)

4
值得注意的是,成员变量始终被引用方式捕获,因为它们实际上是通过捕获的 this 版本进行访问。如果要按值捕获成员,则将其复制到本地,然后按值捕获该本地变量。 - Potatoswatter
1
或者像这样:[&functionEvaluation, varModel_, =] - BЈовић
@KennyTM,你能详细介绍一下unique_ptr<>的用法,或者指出一些相关的参考资料吗?谢谢。 - kiriloff
1
@VJovic:那个的正确语法应该是[=,&functionEvaluation] - kennytm
你知道我的意思,而且更短 :) - BЈовић

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接