我有一堆静态init()
方法,需要在应用程序启动时调用。有点像不得不这样做:
A::init();
S::init();
//...
一种方法是像这样初始化一个静态变量:
static bool const b{A::init(), S::init(), false};
有没有更好的选择?
不要自动初始化。在main
.
原因是:
我已经玩了很多次“生活之前的生活”,然后才意识到它通常比必要的更痛苦。
因此,我的建议是:
int main() {
A::init();
S::init();
// ...
}
为清楚起见,可能值得创建一个init
依次调用所有这些函数的函数。
除非各种库之间的依赖关系树非常清晰,否则我建议不要打包(即B::init
调用A::init
),因为在菱形依赖关系的情况下,您最终可能会init
多次调用基础库。
您可以使用启动类的实例,在其构造函数中初始化各种组件并在其析构函数中终止它们。例子:
struct Startup
{
Startup()
{
A::Init();
B::Init();
}
~Startup()
{
B::Term();
A::Term();
}
};
namespace { Startup startup; }
int main()
{
// do stuff being completely oblivious to the startup
}
就个人而言,我绝对建议保持简单:初始化内部的东西main
,而不是使用魔法静态。这样一来,它的发生就很明确了,它发生的时候也很明确。您可以推断应用程序发生前后的状态。
之前和之后发生的任何事情main
都只会导致麻烦。
您可以拥有一个通过可变参数列表init_dispatch
调用的模板:init()
template<typename T>
struct dispatch
{
dispatch() { T::init(); }
};
template<typename... Ts>
struct init_dispatch : std::false_type
, dispatch<Ts>...
{
init_dispatch() : dispatch<Ts>{}... {}
};
static bool const b = init_dispatch<A, S>{}.value;