单例模式是最常使用的设计模式之一,特别在跨文件编程时使用的最多。
#include<boost/noncopyable.hpp>
#include<pthread.h>
#include<stdlib.h>
template<typename T>
class Singleton: boost::noncopyable //默认使用private继承,显示public也OK
{
public:
static T &instance() //注意只对外提供一个接口
{
pthread_once(&_once,&Singleton<T>::init); //使用线程库中pthread_once,函数只执行一次
return *value;
}
private:
static void init()
{
value = new T();
::atexit(destroy); //程序结束时会调用
}
static void destroy()
{
typedef char check_complete[sizeof(T) == 0 ? -1:1]; //如果类型T只有声明,没有定义,编译不通过 (typedef在编译时执行)
delete value;
}
private:
static T* value;
static pthread_once_t _once;
};
template<typename T>
pthread_once_t Singleton<T>::_once = PTHREAD_ONCE_INIT;
template<typename T>
T* Singleton<T>::value = NULL;