我试图创建一个类,在构造函数中将一个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 };
}
}
现在我希望这个功能成为班级的朋友,但我找不到办法。
答案 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;} };
}