C++ 内联初始化静态函数成员

Ric*_*rdo 1 c++ inline class function c++11

我想实现一个成员函数,如下所示:

void X() {}

class Foo
{
    static void(*Bar)() = X;
};
Run Code Online (Sandbox Code Playgroud)

这不会编译:

错误:非整数类型的静态数据成员“void (* Foo::Bar)()”的类内初始化需要“constexpr”

我知道这是不合法的。我必须在类范围之外初始化 Bar 或将其设置为“内联静态”。问题是后者是 C++17 功能,而我必须使用 C++11(BCC32X 限制)。所以我的问题是:有没有办法在同一行上做到这一点?也许使它成为常量?我知道我们可以做到这一点(来源)...

class Foo
{
    static int const i = 42;
}
Run Code Online (Sandbox Code Playgroud)

但我们能以某种方式将它应用到函数中吗?

PD:我知道我的问题有无限的解决方案,但到目前为止,我所看到的所有解决方案最终都依赖于我无法使用的后来的 C++ 功能。

rtu*_*ado 5

从 C++11 开始,您可以constexpr在类声明中用于初始化非整数/枚举类型的静态成员。

正如@paddy 下面评论的那样,这使得Barconst 成为一个可行的解决方案,如果您不打算修改它,即您在问题代码中没有做的事情,那么它只是一个可行的解决方案。

[演示]

#include <iostream>  // cout

void X() {
    std::cout << "Blah\n";
}

struct Foo {
    static constexpr void(*Bar)() = X;
};

int main() {
    Foo::Bar();
}
Run Code Online (Sandbox Code Playgroud)

  • 除非OP确认他们永远不会在运行时修改函数指针,否则我们不能假设这是一个可行的解决方案。当“Bar”是常量表达式时,它不能在运行时修改,而静态值可以。 (2认同)