一个增强版单例模板(介绍看注释)

namespace x2lib
{
	namespace xUtils
	{
		/**
		* @brief        增强版单例模板,三个特点:
		*					1.代码精炼,仅需一个.h文件;
		*					2.支持对单例对象进行初始化和反初始化;
		*					3.支持在初始化时向单例对象传参;
		* @param[in]    T 欲设为单例的类
		* @param[in]    Args 构造函数参数类型
		* @author       xktesla
		*/
		template <typename T, typename...Args> class ISingleton
		{
		public:
			/**
			* @brief        初始化单例
			* @param[in]    Args 构造函数参数类型
			* @return		是否初始化成功,由派生类initInst()返回值决定
			* @author       xktesla
			*/
			static bool InitInst(Args...args)
			{
				T*& pInstance = _get_static_ptr_();
				if (pInstance == nullptr)
				{
					pInstance = new T(args...);
					return pInstance->initInst();
				}
				return true;
			}

			/**
			* @brief        反初始化单例
			* @return		
			* @author       xktesla
			*/
			static void UnInitInst()
			{
				T*& pInstance = _get_static_ptr_();
				if (pInstance != nullptr)
				{
					pInstance->unInitInst();
					delete pInstance;
					pInstance = nullptr;
				}
			}

			/**
			* @brief        获取单例
			* @return		单例指针
			* @author       xktesla
			*/
			static T* GetInst()
			{
				return _get_static_ptr_();
			}

		protected:
			ISingleton() { }
			virtual ~ISingleton() { }

			/**
			* @brief        初始化接口,为派生类提供一次初始化机会
			* @return		是否初始化成功,将作为InitInst的返回值
			* @author       xktesla
			*/
			virtual bool initInst() { return true; };

			/**
			* @brief        反初始化接口,为派生类提供一次反初始化机会
			* @author       xktesla
			*/
			virtual void unInitInst() {};

		private:
			/**
			* @brief        存储单例对象,如此设计主要用于避免多出一个cpp文件
			* @return		返回单例对象指针的引用
			* @author       xktesla
			*/
			static T*& _get_static_ptr_()
			{
				static T* pInstance = nullptr;
				return pInstance;
			};
		};
		
	}
		
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xktesla

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值