我有一个类,它具有指向内核函数的函数指针,可以从外部改变.
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
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现"呈现"的行为,例如.读取lambda中的类变量.我可以通过传入f内部并写入来绕过它f.bar.i,但这不是一个很好的解决方案.
asl*_*slg 19
在C++ 14中你可以把它写成,
f.kernel = [&i = f.bar.i]() -> double { return i * i; };
Run Code Online (Sandbox Code Playgroud)
如果你没有C++ 14,你也可以创建另一个变量,
int &i = f.bar.i;
f.kernel = [&i]() -> double { return i*i; };
Run Code Online (Sandbox Code Playgroud)
虽然传球f和写作都没有错f.bar.i.
看来你不能这样做.没有构造来创建成员函数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()
Run Code Online (Sandbox Code Playgroud)
请注意,您不能为这两个字段命名kernel.