仅在第一次发生某些事情时才完成的事情是在第一次执行周围函数期间初始化函数局部静态。那么你该怎么做呢:
class X {
static int firstInitFunc();
public:
X() {
static int onFirstCtorCall = firstInitFunc();
}
};
现在第一次创建X,onFirstCtorCall 将被初始化(线程安全),调用该函数。 X 的任何后续创建都不会再次调用该函数。
如果您在X 上有多个构造函数,您仍然只需要一次调用该函数。您可以通过使用静态变量委托给构造函数或使用另一个静态函数来实现:
C++11:
class X {
static int firstInitFunc();
public:
X() {
static auto onFirstCtorCall = firstInitFunc();
}
X(int) : X() // delegate to X()
{ /* ... */ }
};
C++03:
class X {
static int firstInitFunc();
static void callFirstInit() {
static int onFirstCtorCall = firstInitFunc();
}
public:
X() {
callFirstInit();
}
X(int) {
callFirstInit();
}
};
更新:我会参考 juanchopanza 的评论并提供一个使用 std::call_once 的示例:
C++11 使用 call_once
class X {
static void firstInitFunc(); //see note to return types
static std::once_flag firstInitFlag;
public:
X() {
std::call_once(firstInitFlag, firstInitFunc);
}
X(int) {
std::call_once(firstInitFlag, firstInitFunc);
}
};
返回类型的注意事项:虽然在用于函数调用的函数局部静态初始化的情况下,该函数必须返回一个值,而静态将被初始化。相比之下,std::call_once 函数可能没有返回类型,因为任何返回值都不会被计算。