如何使一个lambda函数成为一个类的朋友?

时间:2017-01-23 18:21:41

标签: c++ lambda friend

我试图创建一个类,在构造函数中将一个lambda函数作为参数,我希望这个函数成为该类的朋友。该类的代码如下所示:

using func = std::function<void(void)>;    

class foo
{
public:
    foo(func f)
    {
        this->f = f;
    }

    func f;
private:
    int value_I_want_to_modify; //an int I want to change from the function I've passed in the constructor
}

main()我会写这样的东西:

int main()
{
    //this will give an error because I cannot access private members from outside class
    foo v
    {
        [&v](void) { v.value_I_want_to_modify = 0 };
    }
}

现在我希望这个功能成为班级的朋友,但我找不到办法。

3 个答案:

答案 0 :(得分:2)

你不能让lambda成为朋友,因为(根据定义)你不能命名它的类型(你需要朋友声明)。

答案 1 :(得分:2)

你不能让任意$statement->getRowCount()朋友成为朋友,因为你不知道你何时写下朋友声明的价值是什么。

你不能把lambda变成朋友,正如Jesper所说。

您可以做的是在调用时将您的内部状态传递给函数。

如果您要公开多个内部成员,可以将它们包装在一个结构中,以保持参数列表的可管理性。

例如

std::function

如果你真的想在你的电话网站上找到一个无效(零参数)函数,你可以先bind论证:

class foo
{
public:
    struct state {
        int value;
        // any other internal values here
    };

    foo(std::function<void(state&)> fun) : f(fun) {}
    void run() { f(s); }

private:
    state s;
    std::function<void(state&)> f;
};

(注意在第二个版本中,我只是传递了指向内部状态的指针,以避免class foo { // ... foo(std::function<void(state*)> fun) : f(std::bind(fun, &s)) {} void run() { f(); } private: state s; std::function<void(void)> f; }; )。

答案 2 :(得分:2)

  

如何让一个lambda函数成为类的朋友?

你做不到。这是一个引人注目的问题。

如果在定义类之前定义lambda函数,则无法访问该类的成员变量。

using func = std::function<void(void)>;    

class foo;

// Trying to define the lambda function before the class.
// Can't use f.value_I_want_to_modify since foo is not defined yet.
auto lambda_function = [](foo& f) { f.value_I_want_to_modify = 0;}

class foo
{
   public:
      foo(func f)
      {
         this->f = f;
      }

      func f;
   private:
      int value_I_want_to_modify;
};

int main()
{
    foo v{lambda_function};
}

如果在定义类之后定义lambda函数,则不能使lambda函数成为类的朋友。

using func = std::function<void(void)>;

class foo
{
   public:
      foo(func f)
      {
         this->f = f;
      }

      func f;
   private:
      int value_I_want_to_modify;
};

int main()
{
   foo f
   {
      // Can't make the lambda function a friend of foo
      // since it cannot be declared before the class definition.
      [&f](void) { f.value_I_want_to_modify = 0;}
   }
}

最简单的解决方法是修改lambda函数以接受int&作为参数并修改其值。

#include <functional>

using func = std::function<void(int&)>;

class foo
{
   public:
      foo(func f)
      {
         this->f = f;
         this->f(value_I_want_to_modify);
      }

   private:

      func f;
      int value_I_want_to_modify;
};

int main()
{
   foo v{ [](int& out) { out = 0;} };
}