关于学习 《深入应用c++11》的代码笔记:

c++11之前是这么实现的

template<typename T>
class Singleton{
public:
static T* Instance(){
if (m_pInstance == nullptr)
m_pInstance = new T();
return m_pInstance;
} template<typename T0>
static T* Instance(T0 arg0){
if (m_pInstance == nullptr)
m_pInstance = new T(arg0);
return m_pInstance;
} template<typename T0,typename T1>
static T* Instance(T0 arg0, T1 arg1){
if (m_pInstance == nullptr)
m_pInstance = new T(arg0, arg1);
return m_pInstance;
} template<typename T0, typename T1,typename T2>
static T* Instance(T0 arg0, T1 arg1,T2 arg2){
if (m_pInstance == nullptr)
m_pInstance = new T(arg0, arg1,arg2);
return m_pInstance;
} template<typename T0, typename T1, typename T2,typename T3>
static T* Instance(T0 arg0, T1 arg1, T2 arg2,T3 arg3){
if (m_pInstance == nullptr)
m_pInstance = new T(arg0, arg1, arg2,arg3);
return m_pInstance;
} template<typename T0, typename T1, typename T2, typename T3,typename T4>
static T* Instance(T0 arg0, T1 arg1, T2 arg2, T3 arg3,T4 arg4){
if (m_pInstance == nullptr)
m_pInstance = new T(arg0, arg1, arg2, arg3,arg4);
return m_pInstance;
} template<typename T0, typename T1, typename T2, typename T3, typename T4,typename T5>
static T* Instance(T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4,T5 arg5){
if (m_pInstance == nullptr)
m_pInstance = new T(arg0, arg1, arg2, arg3, arg4,arg5);
return m_pInstance;
} static T* GetInstance()
{
if (m_pInstance == nullptr)
throw std::logic_error("the instance is not init,please init the instance first"); return m_pInstance;
} static void DestroyInstance(){
delete m_pInstance;
m_pInstance = nullptr;
} private:
Singleton(void);
virtual ~Singleton(void);
Singleton(const Singleton&);
Singleton& operator = (const Singleton); static T* m_pInstance;
}; template<class T> T* Singleton<T>::m_pInstance = nullptr; //============================================
struct A{
A(){}
}; struct B{
B(int x){}
}; struct C{
C(int x, double y){}
}; int _tmain(int argc, _TCHAR* argv[])
{
Singleton<A>::Instance();
Singleton<A>::Instance();
Singleton<B>::Instance(1);
Singleton<C>::Instance(1,3.14); Singleton<A>::DestroyInstance();
Singleton<B>::DestroyInstance();
Singleton<C>::DestroyInstance(); return 0;
}

  c++11之后可以简略一点,使用了可变模板参数

template<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 DestroyInstance()
{
delete m_pInstance;
m_pInstance = nullptr;
} private:
Singleton(void);
virtual ~Singleton(void);
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
private:
static T* m_pInstance;
}; template<class T>T* Singleton<T>::m_pInstance = nullptr; #include <iostream>
#include <string> using namespace std; 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 _tmain(int argc, _TCHAR* argv[])
{
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>::DestroyInstance();
Singleton<B>::DestroyInstance();
Singleton<C>::DestroyInstance(); return 0;
}

  

最新文章

  1. 代码的坏味道(13)——过多的注释(Comments)
  2. java sdk与jdk区别
  3. Linux下chkconfig命令详解
  4. Cocos2d-JS项目之一:环境(IDE 运行js-tests、IDE 和 studio 统一工程)
  5. Xcode 遇到 App Transport Security has blocked a cleartext HTTP 错误
  6. 1.NSThread
  7. shell脚本实例-系统监控
  8. Python代码编辑器
  9. Nginx 禁止IP访问
  10. H5页面请求跨域问题
  11. 深入理解计算机系统第二版习题解答CSAPP 2.10
  12. 关于java中for和foreach循环
  13. 在Ubuntu14.04下安装运行Unity-tweak-tool报错scheme missing的解决办法
  14. 使用C语言编写windows服务一般框架
  15. CSDN社区投诉申请表
  16. poj 2417 &amp;&amp; poj3243(Baby-Step Giant-Step)
  17. Oracle数据库启动出现ORA-27101错误之ORA-19815处理方式及数据备份
  18. Myeclipse的使用技巧
  19. Jlink使用技巧之读取STM32内部的程序
  20. 我的代码-data pulling

热门文章

  1. corejava-内容梳理
  2. JAVA servlet 上传文件(commons-fileupload, commons-io)
  3. phone手机比较
  4. xe Style
  5. Tomcat Servlet学习
  6. 代码报错记录-MAVEN-2
  7. TPCC-MySQL的安装与使用
  8. Haskell语言学习笔记(51)Comonad
  9. delphi 中判断对象是否具备某一属性
  10. HttpClientUtil 工具类