基于c++11的单例模式

// 单例模式:任意类型,任意参数的的单例
//线程安全,c++11保证了static变量是线程安全的
//优点:支持任意参数的类型;支持完美转发
 template <typename T>
 class Single
 {
 public:
	 template<typename ...Arg>
	 static T* Insatnce(Arg&&... arg)
	 {
		 if (m_instance == nullptr)
			 m_instance = new T(std::forward<Arg>(arg)...);
		 return m_instance;

	 }
	 static T* getInstance()
	 {
		 if (m_instance == nullptr)
			 throw std::logic_error("not init");
		 return m_instance;
	 }
	 static void Destory()
	 {
		 if (m_instance != nullptr)
			 delete m_instance;
		 m_instance = nullptr;
	 }
 private:
	 Single() = default;
	 ~Single() {}
	Single&operator=(const Single&rv) = delete;
	 Single(const Single&rv) = delete;

 private:
	 static T * m_instance;//静态成员必须初始化
 };
 template<typename T> 
 T*Single<T>::m_instance = nullptr;


 //测试代码
 class Heart
 {
	 
 public:
	 Heart(int a, string c) :weight(a), color(c){}
	 int weight;
	 string color;
 };

 class Stu
 {
 public:
	 Stu(string n, int a, string g, double sc) :nama(n), age(a), gender(g), score(sc) {}
	 string nama;
	 int age;
	 string gender;
	 double score;
 };
 struct A
 {
	 A(const string&) { cout << "lv" << endl; }
	 A(string &&) { cout << "rv" << endl; }

 };
int main()
{
	string  sr = "yang";
	Single<A>::Insatnce("yang");
	auto satu = Single<A>::getInstance();
	
	Single<Stu>::Insatnce("yang", 23, "men", 100);
	auto stu = Single<Stu>::getInstance();

        Single<Heart>::Insatnce(23, "red");
	auto heart = Single<Heart>::getInstance();
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值