</pre><pre code_snippet_id="384326" snippet_file_name="blog_20140609_1_6941024" name="code" class="cpp">
/**
* \file singleton.h
* \date 06-09-2014
* \author GaoYang
* \brief singleton pattern的一个模板实现, 适用于单线程.
* \par Revision History(No.->date->by->actions)
* \par
* #001....06-09-2014....GaoYang....
*/
#pragma once
#include <memory>
using namespace std;
#define DECLARE_SINGLETON_CLASS(type) \
friend class auto_ptr<type>; \
friend class CSingleton<type>; \
protected: \
type(void); \
virtual ~type(void); \
type(const type&){} \
public:
template<class T>
class CSingleton
{
friend class auto_ptr<CSingleton>;
public:
static T* Instance();
protected:
CSingleton()
{
}
virtual ~CSingleton()
{
}
private:
CSingleton(const CSingleton&)
{
}
static auto_ptr<T> m_pInstance;
};
template <class T>
auto_ptr<T> CSingleton<T>::m_pInstance;
template<class T>
inline T* CSingleton<T>::Instance()
{
// if (NULL == m_pInstance.get())
{
// lock here
if (NULL == m_pInstance.get())
{
m_pInstance.reset(::new T);
}
// unlock here
}
return m_pInstance.get();
}
class MyClass : public CSingleton<MyClass>
{
DECLARE_SINGLETON_CLASS(MyClass)
public:
void f();
private:
};
int _tmain(int argc, _TCHAR* argv[])
{
MyClass *p = MyClass::Instance();
p->f;
return 0;
}