C++ — лямбда-выражение, предложение захвата и члены класса

Я использую синтаксис PPL и parallel_for, чтобы иметь цикл for. В предложении захвата у меня есть 3 переменные, одна из них является членом класса. Ошибка компиляции из-за наличия члена класса среди переменных в предложении захвата. Однако, если у меня есть этот член класса в теле лямбда, он также не компилируется, и указанная ошибка заключается в том, что переменная в охватывающей области должна быть в предложении захвата. Как действовать? Должен ли я заранее скопировать элемент переменной в локальную переменную и передать его в предложении захвата?

Вот код с 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_;
    });

Спасибо!


person kiriloff    schedule 30.04.2012    source источник


Ответы (1)


Вам нужно захватить this для доступа к переменным-членам (помните, что formulaCommand эквивалентно this->formulaCommand).

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

(Кстати, вам, вероятно, следует использовать интеллектуальный указатель (unique_ptr<MLEquationCommand>) вместо того, чтобы вручную delete использовать необработанный указатель command_.)

person kennytm    schedule 30.04.2012
comment
Также стоит отметить, что переменные-члены всегда захватываются по ссылке, поскольку доступ к ним осуществляется через захваченную версию this. Если вы хотите захватить элемент по значению, скопируйте его в локальный объект, а затем запишите его по значению. - person Potatoswatter; 30.04.2012
comment
Или вот так: [&functionEvaluation, varModel_, =] - person BЈовић; 30.04.2012
comment
@KennyTM Не могли бы вы рассказать об использовании unique_ptr<> или указать на какую-нибудь соответствующую ссылку? Благодарность - person kiriloff; 30.04.2012
comment
@VJovic: правильный синтаксис для этого будет [=, &functionEvaluation]. - person kennytm; 30.04.2012
comment
Вы знаете, что я имел в виду, и даже короче :) - person BЈовић; 30.04.2012