我有一个具有指向内核函数的函数指针的类,它可以从外部改变。
class Bar
{
public:
int i;
}
class Foo
{
public:
std::function<double()> kernel;
Bar bar;
};
int main()
{
Foo f;
f.kernel = []() -> double { return i * i; }; //this is not working obviously
}
我如何实现“呈现”的行为,例如。读取lambda中的类变量。我可以通过将f
传递到内部并编写f.bar.i
来绕过它,但这不是一个很好的解决方案。
答案 0 :(得分:19)
在C ++ 14中,你可以把它写成,
f.kernel = [&i = f.bar.i]() -> double { return i * i; };
如果您没有C ++ 14,您也可以创建另一个变量
int &i = f.bar.i;
f.kernel = [&i]() -> double { return i*i; };
虽然传递f
并撰写f.bar.i
并没有错。
答案 1 :(得分:7)
似乎是you cannot do so。 没有构造来创建成员函数lambda。
但你可能会遵循@ KerrekSB的建议,除此之外,调用仍然可以获得成员函数:
class Foo
{
public:
double kernel()
{
_kernel(*this);
}
std::function<double(Foo &)> _kernel;
};
Foo f;
f._kernel = [](Foo &f) -> double { return f.i * f.i; };
f.kernel()
请注意,您无法为两个字段kernel
命名。
答案 2 :(得分:0)
lambda函数不知道i或Bar。怎么会知道?您需要传递参考。如果你以不同的方式定义函数体,那么你可以将i作为参数传递,并在类中调用它,你应该得到你想要的。