クラスの構成(2)

こーいうローカルクラスを作ってあげるとうまくいく。

ローカルクラスは含まれているクラスの名前で修飾されるから

違うクラスに含まれるローカルクラスは違うクラスになるのだ。

とりあえずソース。

template <typename T>
struct Monostate{};

class A
{
    static int mCount;
public:
    A(){
        ++mCount;};
    ~A(){--mCount;};
    void say(){cout << "Hello! Im A(" << mCount << ")" << endl;};
};
int A::mCount=0;

template <typename T,typename U>
class B
{
    template <typename V>
    struct Model
    {
        typedef V ModelElement;
        V& Get(){return mt;}
        V mt;
    };

    template <typename V,template <> class C,template <> class L>
    struct Model<Singleton<V,C,L> >
    {
        typedef V ModelElement;
        V& Get(){return Singleton<V,C,L>::Instance();}
    };

    template <typename V>
    struct Model<Monostate<V> >
    {
        typedef V ModelElement;
        V& Get(){return mt;}
        static V mt;
    };
public:
    void say(){Get().say();};
private:
    typename Model<T>::ModelElement& Get()
    {
        return t.Get();
    }
    Model<T> t;
};

template <typename T,typename U>
template <typename V>
V typename B<T,U>::Model<Monostate<V> >::mt;

int _tmain(int argc, _TCHAR* argv[])
{
    {//クラスごとにAを持たせる
        typedef Monostate<A> ModelType;
        B<ModelType,int> bi1;
        bi1.say();
        B<ModelType,int> bi2;
        bi2.say();
        B<ModelType,char> bc1;
        bc1.say();
        B<ModelType,char> bc2;
        bc2.say();
    }
    {//オブジェクトごとにAを持たせる
        typedef A ModelType;
        B<ModelType,int> bi1;
        bi1.say();
        B<ModelType,int> bi2;
        bi2.say();
        B<ModelType,char> bc1;
        bc1.say();
        B<ModelType,char> bc2;
        bc2.say();
    }    
    {//BクラステンプレートでひとつのA
        typedef Singleton<A> ModelType;
        B<ModelType,int> bi1;
        bi1.say();
        B<ModelType,int> bi2;
        bi2.say();
        B<ModelType,char> bc1;
        bc1.say();
        B<ModelType,char> bc2;
        bc2.say();
    }
	return 0;
}

ちなみにSingletonはLokiのSingletonHolderクラスの

スレッドモデルポリシーを抜いた自作クラス。

っていうか、ぱくr・・

で、結果は意図したとおりに動く。


Hello! Im A(2)
Hello! Im A(2)
Hello! Im A(2)
Hello! Im A(2)
Hello! Im A(3)
Hello! Im A(4)
Hello! Im A(5)
Hello! Im A(6)
Hello! Im A(3)
Hello! Im A(3)
Hello! Im A(3)
Hello! Im A(3)