我有一个包含函数指针的类。我想静态初始化该类的各种实例,但我想不出正确的语法。
比方说,这是我的类(class)
class fooClass
{
int theToken;
string theOutput;
bool (*theDefault)( void );
};
我现在想创建一个静态实例,像这样......
fooClass test
{
1,
"Welcome",
(){ return (theToken & 1 ) ? true : false; }
};
正如我所说,我想不出函数指针行的正确语法。或者甚至有可能这样吗?我真的很想不必将我以这种方式创建的每个函数分解到它自己的函数声明中。
我想做的是,让每个实例都有一个唯一的默认函数,因为每个实例都代表一个更大系统的唯一数据驱动构建 block 。我放在那里的代码仅用于说明目的。这个默认函数将访问某些全局变量以及一些成员变量,如果需要,我可以将其传递给函数。
有人能给我指出正确的方向吗?我必须如何编写初始化才能使其在 C++14 下工作?
最佳答案
如果你想引用函数内部的结构成员,你不能只使用一个不接收任何参数的普通函数指针,因为它不接收 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*)>
允许 even functors, lambdas with captures & co.如果您可以接受增加的开销。
您可能想使用普通的 std::function<bool()>
相反,并使用通过引用捕获实例的 lambda,例如
fooClass test
{
1,
"Welcome",
[&test] (){ return (test->theToken & 1 ) ? true : false; }
};
这确实有效,但如果 test
则极其危险恰好被复制,如theDefault
仍将引用 test
即使在拷贝中(甚至在原件被销毁之后)。
(顺便说一句,这就是 OOP 在 Lua 等语言中经常使用的方式,但是 (1) 对象不会被复制,并且 (2) 自动内存管理确保闭包“保持”它们捕获的对象)
关于c++ - 函数指针的静态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49526986/