一部の特殊化のためにのみAPI を初期化し、一度だけ初期化するという問題に対処するには、次のようにします。
#include <iostream>
template <typename T>
struct Wrapper
{
// class who will be statically instantiated
struct CtorClass
{
CtorClass()
{
std::cout << "Init\n";
}
};
static CtorClass static_ctor;
static void compute1(){}
static void compute2(){}
};
// definition for template static member cons
template <typename T>
typename Wrapper<T>::CtorClass Wrapper<T>::static_ctor;
struct NeedInit{};
// you will have to use static_ctor in every funcition of the
template <>
void Wrapper<NeedInit>::compute1()
{
static_ctor;
}
template <>
void Wrapper<NeedInit>::compute2()
{
static_ctor;
}
int main()
{
Wrapper<int>::compute1();
Wrapper<int>::compute2();
Wrapper<NeedInit>::compute1();
Wrapper<NeedInit>::compute2();
}
悲しいことに、この方法では、クラスstatic_ctor
に属するすべての関数の特殊化で使用する必要があります。Wrapper<NeedInit>
ただし、初期化が既に呼び出されているかどうかを確認する必要はありません。
次に、あなたが言ったようにエラーをキャッチできます。