【问题标题】:c++11 lambda function object memberc++11 lambda函数对象成员
【发布时间】:2014-11-13 20:14:33
【问题描述】:

我正在为一些科学计算编写一个 C++ 抽象类库。在其中一个类中,我使用了一个函数对象,以便可以将它作为数值算法中的参数传递。我必须这样做,因为通常计算需要我无法在数值算法中传递的其他参数。我使用私有类(嵌套类)成功实现了代码,用于构造函数对象。我现在正在尝试使用 lambdas 重写类以创建函数对象,但我不确定如何限制对 lambdas 中特定成员变量的访问。

我有一个简单的程序来说明我面临的问题。

#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 限制对外部范围的访问。

任何想法/建议将不胜感激。

【问题讨论】:

  • 只是出于好奇:您为什么要这样做(限制访问)?
  • 只是出于好奇... ;)

标签: c++ c++11 lambda c++14


【解决方案1】:

中,您可以使用std::reference_wrapper&lt;T&gt; 并按值捕获该包装器:

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

中,您可以使用通用的 lambda 捕获表达式:

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

DEMO 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    相关资源
    最近更新 更多