2014-11-13 3 views
2

Я пишу библиотеку абстрактных классов на C++ для некоторых научных вычислений. В одном из классов я использую объект функции, чтобы передать его в качестве аргумента в числовом алгоритме. Я должен сделать это, как правило, для вычисления требуются дополнительные аргументы, которые я не могу передать в числовом алгоритме. Я успешно реализовал код, используя частный класс (вложенный класс) для построения объекта функции. Я пытаюсь переписать класс, используя lambdas для создания объектов функции, но я не уверен, как ограничить доступ к определенным переменным-членам в lambdas.C++ 11 член объекта функции лямбда

У меня есть простая программа, иллюстрирующая проблему, с которой я столкнулся.

#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

Смежные вопросы