c++ - 模拟模板类的静态构造函数

标签 c++ templates constructor static static-constructor

我想要一个带有静态数据成员的模板化类,并通过模拟“静态构造函数”来初始化它。对于非模板类,这已经得到解答(参见 static constructors in C++? I need to initialize private static objectsWhat 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

这是“静态初始化顺序失败”的一个例子吗?

最佳答案

不,它不是静态初始化顺序失败。这只是模板类的每个成员本身就是一个模板这一事实的结果,因此在使用之前不会实例化。

您的代码从不使用 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;
}

这会以更简单的方式为您提供所需的内容。

关于c++ - 模拟模板类的静态构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47703975/

相关文章:

c++ - boost::any 析构函数崩溃

C++ 编译错误(gcc 4.7)

C++ 模板编译器错误

java - 如何让对象访问其调用对象的变量并修改它们?

c++ - gcc 链接器扩展 __attribute__((constructor)) 导致 main() 崩溃

c++ - 集中式事件分发的优缺点

c++ - 字符串超出范围异常

c++ - 变量模板编译时数组

c++ - 在 C++ 中自动/模板化生成测试 vector

C++:如何在对象构造期间调用初始化列表之外的成员构造函数?