template <typename T>
class Singleton
{
protected:
static T* singleton_;
public:
Singleton(void)
{
assert(!singleton_);
#if defined(_MSC_VER) && _MSC_VER < 1200
int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
singleton_ = (T*)((int)this + offset);
#else
singleton_ = static_cast< T* >(this);
#endif
}
~Singleton(void){ assert(singleton_); singleton_ = 0; }
static T& getSingleton(void) { assert(singleton_); return (*singleton_); }
static T* getSingletonPtr(void){ return singleton_; }
};
#define KBE_SINGLETON_INIT( TYPE ) \
template <> TYPE * Singleton< TYPE >::singleton_ = 0; \
创建一个自己的类,然后从Singleton这个模板类继承,继承之后,还需要在自己创建的类中的CPP文件中对基类继承下来的static T* singleton_进行初始化:KBE_SINGLETON_INIT(ServerConfig); ServerConfig是我自己创建的类,
然后,在自己的CPP中定义一个ServerConfig g_svrConfig,这样g_svrConfg就是一个全局单件。上面这套单件的好处就是,只要是从这个基类继承下来的派生类,全局一定是唯一的,因为,如果你还想创建一个派生类的对象,不管是用new还是直接创建一个局部对象都会assert(false).
实现单件的思路很多,这里只不过提供了其中一个比较好的方式.