c++11 改进设计模式 Singleton模式
关于学习 《深入应用c++11》的代码笔记:
c++11之前是这么实现的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | 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之后可以简略一点,使用了可变模板参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 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; } |
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话