2009年5月9日星期六

一种自动的singleton工具

singleton单件模式,但建立一个自动的singleton工具就是一个学问了。
看下面描述。

基类singleton
template<class T>
class singleton
{
static T* ms_Singleton;
public:
singleton(void)
{
assert(!ms_Singleton);
int offset = (int)(T*)1-(int)(singleton<T>*)(T*)1;
ms_Singleton = (T*)((int)this+offset);
}
~singleton()
{
assert(ms_Singleton);
ms_Singleton = 0;
}

static T& GetSingleton(void)
{
assert(ms_Singleton);
return (*ms_Singleton);
}

static T* GetSingletonPtr(void)
{
return ms_Singleton;
}
};

template<class T>
T* singleton<T>::ms_Singleton = 0;

派生类

class A : public singleton<A>
{
public:
void outputA() {cout << "10";}
};

使用

static A g_A;
int main()
{
A::GetSingleton().outputA();
return 0;
}

整个来说就是一个比较好的模式。

没有评论: