介绍一种通过模板自动实现的单例模式
#include <assert.h>
template<typename T>
class Singleton
{
static T* ms_Singleton;
public:
Singleton()
{
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<typename T> T* Singleton<T>::ms_Singleton = 0;
这么做可以将任何类转换成单例模式,只需要
1. 从 Singleton<MyClass> 公开派生你的类
2.确保在使用前创建了 MyClass 实例
3.调用 MyClass::GetSingleton 或者 MyClass::GetSingletonPtr()得到
class MyClass : public Singleton<MyClass>
{
public:
MyClass() {}
~MyClass() {}
void DoSomething() {}
private:
};
int main()
{
MyClass myclass;
MyClass::GetSingletonPtr()->DoSomething();
return 0;
}