J´viens de voir.
Le calcul de offset ne sert à rien en fait.
int offset = ( int)(T*)1 - ( int)(Singleton < T>*)(T*)1;
se réduit à
int offset = 1-1;
En fait, je trouve ça plutôt dangereux: ms_Singleton pointe en fait vers this, mais est un pointeur de T, pas de Singleton...
Sachant que offset vaut 0, dans ce cas, ms_Singleton = ( T *)this;
vaut bien
ms_Singleton = ( T*)((int)this + offset);
C´est bizzarement étrange... je vois difficilement l´utilité d´une telle classe... Je l´aurais codé comme suit:
- include < cassert>
template < typename T> class Singleton
{
static T* ms_Singleton;
public:
Singleton( void )
{
assert( ! ms_Singleton ) ;
ms_Singleton = new T;
}
~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;
Kelios
---------