#pragma once #ifndef _LBT_SINGLETON__H_ #define _LBT_SINGLETON__H_ #include /* Not thread safe. Copied from the codeproject (Author: Lai Shiaw San Kent) */ template class ISingleton { public : static T& Instance(); }; template class Singleton : public ISingleton { public : static T& Instance(); static void Destroy(); protected : inline explicit Singleton() { assert(Singleton::instance_ == 0); Singleton::instance_ = static_cast(this); } inline ~Singleton() { Singleton::instance_ = 0; } private : static T* CreateInstance(); static void ScheduleForDestruction(void (*)()); static void DestroyInstance(T*); private : static T* instance_; private : inline explicit Singleton(Singleton const&) {} inline Singleton& operator=(Singleton const&) { return *this; } }; template typename T& Singleton::Instance() { if (Singleton::instance_ == 0) { Singleton::instance_ = CreateInstance(); ScheduleForDestruction(Singleton::Destroy); } return *(Singleton::instance_); } template void Singleton::Destroy() { if (Singleton::instance_ != 0) { DestroyInstance(Singleton::instance_); Singleton::instance_ = 0; } } template inline typename T* Singleton::CreateInstance() { return new T(); } template inline void Singleton::ScheduleForDestruction(void (*pFun)()) { std::atexit(pFun); } template inline void Singleton::DestroyInstance(T* p) { delete p; } template typename T* Singleton::instance_ = 0; #endif