强制模板类的静态成员在程序启动时初始化

问题描述 投票:0回答:1

我有这段代码,它应该打印 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;”打印消息。程序启动时在代码中定义。有办法做到吗?

c++ static initialization
1个回答
0
投票

您正在寻找一种在程序启动后、进入 main() 函数之前触发静态成员初始化的机制。

实现此行为的一种方法是利用全局对象的构造函数在 main() 函数启动之前调用的事实。以下是实现它的方法:

  1. 将 AAA 实例化包装在函数中。
  2. 定义某种类型的全局对象,该对象将在以下位置调用此函数 它的构造函数。

让我们调整您的代码来完成此任务:

#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 的初始化,打印所需的消息。

© www.soinside.com 2019 - 2024. All rights reserved.