强制模板静态成员实例化

val*_*tin 6 c++ static templates instantiation

我正在尝试创建仅在模板实例化时执行某些代码的程序(它将用于低级驱动程序初始化).现在我有以下解决方案.

class Initializer
{
public:
    Initializer(){
        // This code is executed once
    }

    void silly() const{

    }
};

template <class T>
class Proxy{
protected:
    static const Initializer init;
};

template<class T>
const Initializer Proxy<T>::init;

template<class T>
class MyTemplate : public Proxy<void>{
public:
    static void myMethod1(){
        init.silly();

        // ... Something useful
    }

    static void myMethod2(){
        init.silly();

        // ... Something useful
    }
};
Run Code Online (Sandbox Code Playgroud)

Initializer默认构造函数只在情况下,我呼吁执行myMethod1()myMethod2()地方.

但有没有办法摆脱这些init.silly();线?

Mar*_*ica 2

您的问题是,除非引用模板的成员,否则不会实例化它们。

init.silly()您可以只引用该成员,而不是调用:

    static void myMethod1(){
        (void)init;

        // ... Something useful
    }
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望init绝对始终被定义,则可以显式实例化它:

template<>
const Initializer Proxy<void>::init{};
Run Code Online (Sandbox Code Playgroud)