コードの一定量の重要なコンポーネントに使用するテンプレート Singleton クラスがあります。シングルトン コード モデルを使用することは、この質問のポイントではありません。
ここで、このテンプレートを使用するすべてのクラスで共有される静的カウンターをこのクラスに追加したいと思います。あなたのためにそれをコーディングさせてください(コードは網羅的ではありません):
template <class T>
class Singleton
{
public:
Singleton(const std::string &name){
printf("%s CTOR call #%d\n", name.c_str(), _counter);
_counter++;
}
virtual ~Singleton(){}
private:
static int _counter; // I want this to be shared by all classes
}
// I can only initialize it like this; sadly
template<class T>
int Singleton<T>::_counter = 0;
// main code (simplified):
Singleton<MyClass1>("MyClass1") c1;
Singleton<MyClass2>("MyClass2") c2;
Singleton<MyClass3>("MyClass3") c3;
Singleton<MyClass4>("MyClass4") c4;
期待される出力:
MyClass1 CTOR call #0
MyClass2 CTOR call #1 // counter is incremented
MyClass3 CTOR call #2
MyClass4 CTOR call #3
私が得るものは次のとおりです。
MyClass1 CTOR call #0
MyClass2 CTOR call #0 // counter is not incremented
MyClass3 CTOR call #0
MyClass4 CTOR call #0
つまり、静的 int は共有されず、各クラスに固有です。
テンプレート クラスに「非テンプレート」カウンターを含めるにはどうすればよいですか? これはヘッダーのみのテンプレートで可能ですか?