2014-11-13 147 views
2

我正在爲某些科學計算編寫一個C++庫抽象類。在其中一個類中,我使用了一個函數對象,以便我可以將它作爲數值算法中的一個參數傳遞。我必須這樣做,因爲通常計算需要額外的參數,我不能在數值算​​法中傳遞。我成功實現了使用私有類(嵌套類)構建函數對象的代碼。我正在嘗試使用lambdas來創建函數對象,但我不確定如何限制對lambda中的特定成員變量的訪問。C++ 11 lambda函數對象成員

下面我有一個簡單的程序來說明我所面臨的問題。

#include <iostream> 
#include <functional> 
using namespace std; 

class A 
{ 
public: 
    A(int inI, int inJ) : _i(inI), _j(inJ) 
    { 
     create_functor(); 
    } 

    A(const A& rtSide) : _i(rtSide._i),_j(rtSide._j) 
    { 
     create_functor(); 
    } 

    A(A&& rtSide) : _i(rtSide._i), _j(rtSide._j) 
    { 
     rtSide.f = nullptr; 
     create_functor(); 
    } 

    A& operator=(A&& rtSide) 
    { 

     _i = rtSide._i; 
     _j = rtSide._j; 
     create_functor(); 

     rtSide.f = nullptr; 

     return *this; 
    } 

    A& operator=(A& rtSide) 
    { 
     if (this == &rtSide) 
      return *this; 

     _i = rtSide._i; 
     _j = rtSide._j; 
     create_functor(); 

     rtSide.f = nullptr; 

     return *this; 
    } 

    ~A() {} 

    void reset_i(const int& newI) { _i = newI; } 

    function<double(const double&)> f; 

private: 
    void create_functor() 
    { 
     f = [this](const double& inX) -> double {return inX * static_cast<double>(_i); }; 
    } 

    int _i; 
    int _j; 
}; 

int main() 
{ 

    A _A1(2,0); 
    A _A2(1,0); 

    _A2 = _A1; 

    cout << _A2.f(2) << endl; 

    _A2.reset_i(4); 

    cout << _A2.f(2) << endl; 

    return 0; 
} 

雖然上面的代碼工作正常,我無法弄清楚它是如何有可能限制訪問外部範圍只爲成員變量_i。

任何想法/建議,將不勝感激。

+0

只是出於好奇:你爲什麼要這麼做(限制訪問)? –

+1

只是出於好奇...;) – thanasis

回答

5

在C++ 11可以使用std::reference_wrapper<T>並通過值捕獲包裝:

std::reference_wrapper<decltype(_i)> r = _i; 
f = [r](const double& inX) -> double {return inX * static_cast<double>(r.get()); }; 

或其較短當量:

auto r = std::ref(_i); 
f = [r](const double& inX) -> double {return inX * static_cast<double>(r.get()); }; 

DEMO 1

在C++ 14你可以用廣義拉姆達捕獲表達:

f = [&_i = _i](const double& inX) -> double {return inX * static_cast<double>(_i); }; 

DEMO 2