B級科学者もどきの憂鬱

とある理系になりきれない奴のつれづれなる活動記

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

#defineでシングルトン化

デザインパターンの中で、おそらく最もシンプルなのが、
シングルトンパターンでしょう。
他のパターンはあんまり知らないけど、
これだけは使えるという人も多いです。

このパターン、C++のプログラミング系のサイトで、
よくテンプレート化出来ないか取り上げられてますよね。

ただ、シングルトンパターンをテンプレートの継承で行う場合、
どうやってもコンストラクタがprotectedになり、
完全なシングルトンにすることが出来ません。
継承を使わなくとも、色々と問題点が多く、
シンプルな解は中々無いようです。

じゃあテンプレートじゃなくて、マクロでやればいいんじゃね?
と思って作ってみました。

#define SINGLETONIZE(ClassName) \
    private: \
        ClassName(); \
        ~ClassName(); \
        ClassName(const ClassName&); \
        ClassName& operator=(const ClassName&); \
    public: \
        static ClassName& GetInstance() { \
            static ClassName object; \
            return object; \
        }

とても簡単に出来ちゃいました。

シングルトンパターンを知っている人なら、
ほとんど説明はいらないと思いますが、
一応、使い方はこんな感じになります。
シングルトン化したいクラスを、Singleとします。

class Single {

    // メンバ色々……

    SINGLETONIZE(Single)

    // メンバ色々……

};

という風に、クラス宣言内に書けばOKです。

シングルトン化したいクラス名以外のものをマクロの引数に渡すと、
多分全ての場合でコンパイラがエラーを吐きますので、
マクロでよくある様々な障害とも無縁だと思います。

スレッドセーフな実装ではありませんので、
マルチスレッドでは直接使えませんが、
多少改変すれば出来るはずです。

こんなマクロを作っている人を案外見かけないのですが、
どうしてなのでしょうか?
あまりにも自明な解過ぎて載せる価値が無いという事か、
はたまた、マクロなんて邪道ってことなんでしょうかね。
何事も適材適所だと思いますが。

スポンサーサイト

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。