C++11可变参数模板单例模式

单例模式

该示例代码采用C11标准,解决以下问题:

  1. 通过类模板函数实现不同类型单例;
  2. 单例类构造函数支持不同的个数;
  3. 消除代码重复

示例代码

.h文件如下:

cpp 复制代码
//C++11Singleton.h文件
#pragma once

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 DestorInstance()
	{
		delete m_pInstance;
		m_pInstance = nullptr;
	}

private:
	Singleton();
	virtual ~Singleton();
	Singleton(const Singleton&);
	Singleton& operator = (const Singleton&);
private:
	static T* m_pInstance;
};

.cpp文件如下:

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;
}

输出结果如下:

以上只是个示例,该单例非模式还不支持多线程调用。

相关推荐
别动我齐刘海1 小时前
机器人运动控制学习2——基础进阶
c++·人工智能·神经网络·学习·目标检测·机器学习·机器人
小庞在加油1 小时前
WinDbg实战:QT/跨平台项目死锁与无响应问题排查指南
开发语言·qt·windbg·工具
Vae_Mars2 小时前
C#中的delegate委托
开发语言·c#
傻啦嘿哟2 小时前
英雄联盟皮肤爬虫:爬取全皮肤价格与特效,做比价工具
java·c++·爬虫
一直走下去-明2 小时前
简单的http抓包解包完整代码
开发语言·python
caimouse3 小时前
ReactOS 图形系统分析(51):元文件子系统 — metafile.c
c语言·开发语言
码匠许师傅3 小时前
【C++ 面试真题】24. 聊聊 C++ 的时间日期处理
java·c++·面试
闻道且行之3 小时前
图片处理助手|泊松融合原理 + C++ 工程实现,seamlessClone 三模式一次讲透
数据库·c++·人工智能·opencv
学习星球4 小时前
Solid.js 实战:拆解官方 RealWorld 项目
开发语言·javascript·vue.js
OPEN-F4 小时前
Python进阶教程:正则表达式进阶与文本处理
开发语言·python·正则表达式