我想要一个带有静态数据成员的模板化类,并通过模拟“静态构造函数”来初始化它。对于非模板类,这个问题已经得到解答(参见C++ 中的静态构造函数?我需要初始化私有静态对象 https://stackoverflow.com/questions/1197106/static-constructors-in-c-i-need-to-initialize-private-static-objects and 什么是静态构造函数? https://stackoverflow.com/questions/5803953/what-is-a-static-constructor)。然而,这些答案似乎都不适用于模板类。
下面是一个尝试将前面答案中的“静态构造函数”习惯用法改编为模板化类的示例。 (请注意,该示例只是初始化一个int
并且可以在没有这样的构造函数的情况下编写;但是,我需要一个通用的解决方案。)
#include <iostream>
struct Foo
{
static int x;
static struct init
{
init()
{
std::cout << "Initializing Foo..." << std::endl;
x = 1;
}
} initializer;
};
int Foo::x;
Foo::init Foo::initializer;
template<int N>
struct Bar
{
static int x;
static struct init
{
init()
{
std::cout << "Initializing Bar..." << std::endl;
x = N;
}
} initializer;
};
template<int N>
int Bar<N>::x;
template<int N>
typename Bar<N>::init Bar<N>::initializer;
int main()
{
std::cout << Foo::x << std::endl;
std::cout << Bar<1>::x << std::endl;
return 0;
}
这输出:
Initializing Foo...
1
0
但我期望它输出:
Initializing Foo...
Initializing Bar...
1
1
这是“静态初始化顺序惨败”的一个例子吗?
不,是not静态初始化顺序惨败。这只是模板类的每个成员本身就是一个模板这一事实的结果,因此在使用之前不会被实例化。
你的代码从不使用init
会员,所以init
从未被实例化。
不过,你的问题很容易解决:
#include <iostream>
template<int N>
struct Bar
{
static int x;
};
template<int N>
int Bar<N>::x= N;
int main()
{
std::cout << Bar<1>::x << std::endl;
return 0;
}
这以更简单的方式为您提供了您想要的东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)