C++ 内联初始化静态函数成员
C++ inline initialize static function member
我想实现一个成员函数如下:
void X() {}
class Foo
{
static void(*Bar)() = X;
};
这不编译:
error: 'constexpr' needed for in-class initialization of static data member 'void (* Foo::Bar)()' of non-integral type
我知道这是不合法的。我必须在 class 范围之外初始化 Bar 或使其成为“内联静态”。问题是后者是 C++17 功能,我必须使用 C++11(BCC32X 限制)。所以我的问题是:有没有办法在同一条线上做到这一点?也许让它成为常量?我知道我们可以做到这一点(Source)...
class Foo
{
static int const i = 42;
}
但是我们能以某种方式将它应用于函数吗?
PD:我知道我的问题有无限的解决方案,但到目前为止,我所看到的一切最终都依赖于我无法使用的后期 C++ 功能。
从 C++11 开始,您可以使用 constexpr
在 class 声明中初始化 non-integral/enumeration 类型的静态成员。
正如下面@paddy 评论的那样,这使得 Bar
常量,因此只有在您不打算修改它(您在问题代码中没有做的事情)的情况下,它才是一个可行的解决方案。
#include <iostream> // cout
void X() {
std::cout << "Blah\n";
}
struct Foo {
static constexpr void(*Bar)() = X;
};
int main() {
Foo::Bar();
}
我想实现一个成员函数如下:
void X() {}
class Foo
{
static void(*Bar)() = X;
};
这不编译:
error: 'constexpr' needed for in-class initialization of static data member 'void (* Foo::Bar)()' of non-integral type
我知道这是不合法的。我必须在 class 范围之外初始化 Bar 或使其成为“内联静态”。问题是后者是 C++17 功能,我必须使用 C++11(BCC32X 限制)。所以我的问题是:有没有办法在同一条线上做到这一点?也许让它成为常量?我知道我们可以做到这一点(Source)...
class Foo
{
static int const i = 42;
}
但是我们能以某种方式将它应用于函数吗?
PD:我知道我的问题有无限的解决方案,但到目前为止,我所看到的一切最终都依赖于我无法使用的后期 C++ 功能。
从 C++11 开始,您可以使用 constexpr
在 class 声明中初始化 non-integral/enumeration 类型的静态成员。
正如下面@paddy 评论的那样,这使得 Bar
常量,因此只有在您不打算修改它(您在问题代码中没有做的事情)的情况下,它才是一个可行的解决方案。
#include <iostream> // cout
void X() {
std::cout << "Blah\n";
}
struct Foo {
static constexpr void(*Bar)() = X;
};
int main() {
Foo::Bar();
}