我有一堆静态init()
方法,我需要在应用程序启动时调用它们。有点像:
A::init();
S::init();
//...
这样做的一种方法是初始化一个静态变量,如下所示:
static bool const b{A::init(), S::init(), false};
是否存在更好的替代方案?
答案 0 :(得分:3)
您可以使用启动类的实例来初始化其构造函数中的各种组件,并在其析构函数中终止它们。例如:
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
}
答案 1 :(得分:3)
我曾经和#34;生活在主要生活之前玩过#34;很多次,在意识到它通常比必要的更痛苦之前。
我的建议是:
int main() {
A::init();
S::init();
// ...
}
为清楚起见,可能值得创建init
函数,该函数将依次调用所有这些函数。
除非各个库之间的依赖关系树非常明确,否则我建议反对打包(即B::init
调用A::init
),因为在钻石依赖的情况下,你最终可能会多次调用基础库init
。
答案 2 :(得分:3)
不要自动初始化。在main
内启动期间明确初始化子系统。
原因是:
答案 3 :(得分:1)
您可以使用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;
答案 4 :(得分:1)
就个人而言,我绝对建议保持简单:在main
内初始化内容,而不是使用魔法静态。这样就明确了它的发生,并且当发生时它是明确的。并且您可以在应用程序发生之前和之后推断应用程序的状态。
main
之前和之后发生的任何事情往往会导致麻烦。