我有一个包含函数指针的类。我想静态初始化该类的各种实例,但我无法弄清楚这个的正确语法。
让我们说,这是我的班级
class fooClass
{
int theToken;
string theOutput;
bool (*theDefault)( void );
};
我现在想创建一个这样的静态实例,就像这样......
fooClass test
{
1,
"Welcome",
(){ return (theToken & 1 ) ? true : false; }
};
正如我所说,我无法弄清楚函数指针行的正确语法。或者甚至可能这样吗?我真的不想将我创建的每个函数分解为它自己的函数声明。
我要做的是,允许每个实例具有唯一的默认功能,因为每个实例代表一个更大系统的唯一数据驱动构建块。我放在那里的代码仅用于说明目的。这个默认函数将访问某些全局变量以及一些成员变量,如果需要,我可以将它传递给函数。
有人能指出我在正确的方向上如何编写初始化以使其在C ++ 14下工作吗?
答案 0 :(得分:3)
如果你想引用函数内部的struct成员,你不能只使用一个没有接收任何参数的普通函数指针,因为它没有接收this
指针。
我的建议是至少将其更改为指向将实例作为参数的函数的指针,然后在初始化中,您可以传递无捕获的lambda(可以转换为普通函数指针):
class fooClass
{
int theToken;
string theOutput;
bool (*theDefault)( fooClass *that);
// you may provide a helper for ease of use
bool Default() { return theDefault(this);}
};
fooClass test
{
1,
"Welcome",
[] (fooClass *that){ return (that->theToken & 1 ) ? true : false; }
};
您还可以使用std::function<bool(fooClass*)>
来设置偶数函子,带有捕获的lambda和&amp;合。如果你对增加的开销感到满意。
您可能想要使用普通std::function<bool()>
,并使用lambda通过引用捕获实例,例如
fooClass test
{
1,
"Welcome",
[&test] (){ return (test->theToken & 1 ) ? true : false; }
};
这确实有效,但如果test
碰巧被复制,则非常危险,因为theDefault
即使在副本中也会引用test
(甚至在原件出现之后)破坏)。
(顺便说一句,这就是OOP通常用Lua这样的语言完成的方式,但是(1)对象没有被复制。(2)自动内存管理确保闭包&#34;保持活着&#34;对象他们捕获)