2012-04-30 57 views
8

我正在使用PPL和parallel_for語法創建一個for循環。在capture子句中,我有3個變量,其中一個是類成員。由於捕獲條款中變量中存在類成員,因此存在編譯錯誤。然而,如果我在lambda體中有這個類成員,它也不會編譯,並且聲明的錯誤是封閉範圍中的變量應該在capture子句中。如何進行?我應該事先將變量成員複製到本地變量,並將它傳遞給capture子句?C++ - 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_; 
    }); 

謝謝!

回答

7

您需要捕獲this才能訪問成員變量(請記住formulaCommand等於this->formulaCommand)。

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

(順便說一句,你應該使用智能指針(unique_ptr<MLEquationCommand>),而不是手動delete -ing原始指針command_

+4

另外值得一提的是成員變量總是引用捕獲,因爲它們是真正通過捕獲的'this'版本進行訪問。如果您想通過值捕獲成員,請將其複製到本地,然後按值捕獲該成員。 – Potatoswatter

+1

或者像這樣:'[&functionEvaluation,varModel_,=]' –

+0

@KennyTM你可以擴展使用'unique_ptr <>',或指向一些相關的ref?謝謝 – octoback