单例模式
该示例代码采用C11标准,解决以下问题:
- 通过类模板函数实现不同类型单例;
- 单例类构造函数支持不同的个数;
- 消除代码重复
示例代码
.h文件如下:
//C++11Singleton.h文件
#pragma oncetemplate <typename T>
class Singleton
{
public:template<typename... Args>static T* Instance(Args&&... args){if (m_pInstance == nullptr){m_pInstance = new T(std::forward<Args>(args)...);}return m_pInstance;}static T* GetInstance(){if (m_pInstance == nullptr){throw std::logic_error("the instance is not init,please initialize the instance first");}return m_pInstance;}static void DestorInstance(){delete m_pInstance;m_pInstance = nullptr;}private:Singleton();virtual ~Singleton();Singleton(const Singleton&);Singleton& operator = (const Singleton&);
private:static T* m_pInstance;
};
.cpp文件如下:
#include <iostream>
#include "C++11Singleton.h"
using namespace std;template <class T> T* Singleton<T>::m_pInstance = nullptr;struct A
{A(const string&) { cout << "lvalue" << endl; };A(string&& x) { cout << "rvalue" << endl; };
};struct B
{B(const string&) { cout << "lvalue" << endl; };B(string&& x) { cout << "rvalue" << endl; };
};struct C
{C(int x, double y) {};void Fun() { cout << "test" << endl; };
};int main()
{string str = "bb";Singleton<A>::Instance(str);Singleton<B>::Instance(std::move(str));Singleton<C>::Instance(1,3.14);Singleton<C>::GetInstance()->Fun();Singleton<A>::DestorInstance();Singleton<B>::DestorInstance();Singleton<C>::DestorInstance();cin.get();return 0;
}
输出结果如下:
以上只是个示例,该单例非模式还不支持多线程调用。