【问题标题】:C++ - lambda expression, capture clause and class membersC++ - lambda 表达式、捕获子句和类成员
【发布时间】:2012-04-30 07:27:29
【问题描述】:

我正在使用 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_;
    });

谢谢!

【问题讨论】:

    标签: c++ lambda parallel-processing ppl


    【解决方案1】:

    你需要捕获this来访问成员变量(记住formulaCommand等价于this->formulaCommand)。

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

    (顺便说一句,您可能应该使用智能指针 (unique_ptr<MLEquationCommand>) 而不是手动 delete-ing 原始指针 command_。)

    【讨论】:

    • 另外值得注意的是,成员变量总是通过引用捕获,因为它们实际上是通过捕获的this 版本访问的。如果要按值捕获成员,请将其复制到本地,然后按值捕获。
    • 或者像这样:[&functionEvaluation, varModel_, =]
    • @KennyTM 您能否扩展unique_ptr<> 的使用,或指出一些相关的参考资料?谢谢
    • @VJovic:正确的语法是[=, &functionEvaluation]
    • 你知道我的意思,而且更短:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 2021-01-07
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多