我有这段代码,它应该打印 AAA 模板参数中定义的数字:
template<int value>
class AAA
{
public:
AAA()
{
}
class BBB
{
public:
BBB(int num)
{
std::cout << "Value " << num;
}
};
static inline BBB b = {value};
};
void Foo()
{
AAA<1> test;
}
int main()
{
return 0;
}
但是,该代码不起作用,因为静态变量在程序启动时不会自动初始化。如何在程序启动时初始化它而不显式调用它?
基本上我需要为每个“AAA<1> test;”打印消息。程序启动时在代码中定义。有办法做到吗?
您正在寻找一种在程序启动后、进入 main() 函数之前触发静态成员初始化的机制。
实现此行为的一种方法是利用全局对象的构造函数在 main() 函数启动之前调用的事实。以下是实现它的方法:
让我们调整您的代码来完成此任务:
#include <iostream>
template<int value>
class AAA
{
public:
AAA()
{
}
class BBB
{
public:
BBB(int num)
{
std::cout << "Value " << num << std::endl;
}
};
static inline BBB b;
};
// Explicit template instantiation to ensure the static member is initialized.
template<int value>
typename AAA<value>::BBB AAA<value>::b(value);
struct Initializer
{
Initializer()
{
Foo();
}
};
void Foo()
{
AAA<1> test;
}
// Global object to force initialization
Initializer init;
int main()
{
return 0;
}
采用这种方式,当程序启动时,Initializer init;对象将被构造,进而调用 Foo()。这会触发 AAA<1>::b 的初始化,打印所需的消息。