c++ - 函数指针的静态初始化

标签 c++ pointers static

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

比方说,这是我的类(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/

相关文章:

c++ - 传递 const int* 和 int* 时调用不同版本的重载函数 (const int* const&/&&)

c++ - MessageBox 和 ShellExecute 成功,但如果在应用程序退出之前立即调用则不会显示任何内容

c++ - 当变量恰好是指针时,如何在非成员函数中使用私有(private)成员变量?

c - 为什么我不能在线程函数内返回值?

c - 链表中指针的操作

c# - 具有循环依赖的静态字段的反射 GetValue 返回 null

c++ - 在 C/C++ 中为什么 do while(expression);需要半冒号吗?

c++ - 队列会发生什么? (c++)

swift - 在 Swift 中,是否有像 self 这样的关键字,但用于类?

c++ - 使用 libevent 或 boost::asio 在单线程中建立多个 tcp 连接。这是可能的?