在平常的开发工作中,单例是我们经常使用的模式,经常我们需要写无数个单例类,现在提供一种单例模板:
#pragma once
// common include
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
// windows include
#if defined _WIN32
#else
// linux include
#include <errno.h>
#endif
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 _SINGLETON_INIT( TYPE ) \
template <> TYPE * Singleton< TYPE >::singleton_ = 0; \
用法:
class A:public Singleton<A>
{
};
在cpp文件中:
template<> A* Singleton<A>::singleton_ = 0;
_SINGLETON_INIT(A)