转自:http://www.cppblog.com/sandy/archive/2005/11/30/1436.html

template <typename T> class Singleton
{
protected:
static T* ms_Singleton;

public:
Singleton( 
void )
{
    assert( 
!ms_Singleton );
    ms_Singleton 
= static_cast< T* >this );
}
~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 );  }
};

//client端的代码
//Singleton的类
//Root.h
class Root:public Singleton<Root>
{
   
public:
      
void Use();
};

//初始化
//Root.cpp
Root * Singleton<Root>::ms_Singleton =0;
Root g_root;
//must declare once only

//使用
//Test.Cpp
Root::getSingleton().Use();

很简单,使用的技巧是template base class
这种实现方法的好处是复用性好。

【分析:class Root:public Singleton<Root>之后,可以这样看Root,这个Root本质其实就是包含了

template <typename T> class Singleton
{...}

中的{...}大括号中的所有代码,别的什么也不是,不用考虑太复杂了,在此基础上就好理解了。

 

 


不过使用者要声明Root * Singleton<Root>::ms_Singleton =0;挺讨厌的

改进方法:template static member function
也就是改变声明一个static T*在template class,换成使用静态成员函数取出instance

template <typename T> class Singleton
{
private:
static T* & ms_Singleton()
        {
                
static T* ms_Singleton_ =0 ;
                
return ms_Singleton_;
        }
        
public:
Singleton( 
void )
{
    assert( 
!ms_Singleton() );
    ms_Singleton() 
= static_cast< T* >this );
}
~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() );  }
};