#include <cassert.h>
template<typename 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(void)
{ 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;
template<typename 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(void)
{ 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;
以下是使用该类的例子:
class TextureMgr : public Singleton<TextureMgr>
{
public:
Texture* GetTexture(const char* name);
}
{
public:
Texture* GetTexture(const char* name);
}
