函数指针的静态初始化

时间:2018-03-28 05:48:08

标签: c++ pointers static

我有一个包含函数指针的类。我想静态初始化该类的各种实例,但我无法弄清楚这个的正确语法。

让我们说,这是我的班级

    class fooClass
    {
        int         theToken;
        string      theOutput;
        bool        (*theDefault)( void );
    };

我现在想创建一个这样的静态实例,就像这样......

    fooClass test
    {
        1,
        "Welcome",
        (){ return (theToken & 1 ) ? true : false; }
    };

正如我所说,我无法弄清楚函数指针行的正确语法。或者甚至可能这样吗?我真的不想将我创建的每个函数分解为它自己的函数声明。

我要做的是,允许每个实例具有唯一的默认功能,因为每个实例代表一个更大系统的唯一数据驱动构建块。我放在那里的代码仅用于说明目的。这个默认函数将访问某些全局变量以及一些成员变量,如果需要,我可以将它传递给函数。

有人能指出我在正确的方向上如何编写初始化以使其在C ++ 14下工作吗?

1 个答案:

答案 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;对象他们捕获)