2020年2月27日木曜日

C++のヘッダーファイルだけでシングルトンを作る

おじさん、この年になってもいまだにC++で上手にシングルトンが作れません。
スレッドセーフとか考えるとあれ結構難しくない?
やっぱシングルトンは良質な水と原料からでないと作れないっぽいです。

だれでも簡単に任意のクラスをシングルトンにできるクラスとか作れないんだろうか。
よく、シングルトンを作るために.cppファイルでstatic変数を

static MyClass*pmyclass=NULL;

とか宣言するのも意味不明でたまに忘れてコンパイルエラーになってめんどくさいし。
シングルトンのクラスをシングルトンじゃなくしたり意外とめんどくさいじゃん。

.cppファイルがいらない、C++のヘッダーファイルだけで簡単にシングルトンを作れるのか考えてみました。

とりあえず getInstance()の関数の中で、

getInstance(){
Singleton<MyClass> a;
return a.a;
}

このように返せばどんなクラスでもシングルトン化できるテンプレートを作成。
これで数行追加するだけでどのクラスもシングルトン化できてだいぶ便利な気がする。

template<typename A> A Singleton<A>::a;

この一行がポイントですね。
ヘッダーファイル内でグローバル変数宣言できるし。
しかもヘッダーファイルを使わないときは、メモリ使われないし。
やっぱテンプレート機能をつかわないとできないのかなぁ。

----------------------------------
#include <cstdio>

//ここからヘッダーファイルのつもり
template<typename A> class Singleton {
public:
static A a;
};
template<typename A> A Singleton<A>::a;
//ここまでヘッダーファイルのつもり

class ClassA{
public:
ClassA() {
printf("ClassA()\n");
}
virtual ~ClassA(){
printf("~ClassA()\n");
}
static ClassA& getInstance()
{
Singleton<ClassA> a;
return a.a;
}
void func(){
printf("func()\n");
}
};

int main(int argc, char* argv[])
{
ClassA& ca = ClassA::getInstance();
ca.func();
return 0;
}

----------------------------------


0 件のコメント:

コメントを投稿