强制模板化构造函数运行

Force Templated Constructor to Run?

本文关键字:构造函数 运行      更新时间:2023-10-16

我知道有一个initailzer技巧可以强制构造全局对象,而不管它在哪里使用。我相信这是用于std::cout的。

#ifndef GUARD_H
#define GUARD_H
class Magical
{
   // default constructor and such...
};
class Init
{
public:
    Init();
};
extern Magical& magic;
namespace
{
    Init __magical_initializer; // works as this object is constructed in every source file it is included in
}
#endif

src:

#include "magical.h"
#include <new>
static int count; // believe there is a spec somewhere which states global integers are initialized with zero
static alignas(Magical) char buffer[sizeof(Magical)];
Magical& magic = *reinterpret_cast<Magical*>(buffer);
Init::Init()
{
    if(!count++)
    {
        new(buffer) Magical;
    }
}

我想知道是否有一个类似的模板,因此我的代码看起来像这样:

template<typename T>
class Base
{
    static Magical<T> __private; // need this constructor to be called.
};
// usage:
class SomeClass : public Base<SomeClass>
{
};

没有办法解决这个问题,因为源文件中不可能存在模板。