当前位置: 首页 > news >正文

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

单例模式

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

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

示例代码

.h文件如下:

//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文件如下:

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

输出结果如下:
在这里插入图片描述
以上只是个示例,该单例非模式还不支持多线程调用。

相关文章:

  • hi3516cv610通过menuconfig关闭的宏记录
  • 【MySQL数据库】锁机制
  • Linux系统调试
  • ML:Non-deterministic Turing Machine,简称 NTM
  • Vite环境下解决跨域问题
  • 【C++经典例题】杨辉三角问题
  • java自主学习网站(springboot+ssm+mysql)含运行文档
  • 《在 Ubuntu 22.04 上安装 CUDA 11.8 和 Anaconda,并配置环境变量》
  • chromium魔改——绕过无限debugger反调试
  • FreeRTOS同步和互斥机制以及相关API
  • 【开源】Unity 商业级引擎源码加密混淆过马甲包 Il2cpp global-metadata加密方案 Android加固IOS加固
  • Windows修改hosts文件让向日癸软件联网
  • 从开发到上线:基于 Linux 云服务器的前后端分离项目部署实践(Vue + Node.js)
  • 什么是市盈率,通俗解释清楚
  • CAN/FD CAN总线配置 最新详解 包含理论+实战(附带源码)
  • 《JVM考古现场(十六):太初奇点——从普朗克常量到宇宙弦的编译风暴》
  • matlab从pytorch中导入LeNet-5网络框架
  • 数论4 组合数
  • Java全栈面试宝典:线程安全机制与Spring Boot核心原理深度解析
  • 游戏引擎学习第202天
  • 梁山网站建设哪家好/北京搜索引擎优化管理专员
  • 自己网站怎么做百度优化/国内seo工具
  • php能建立网站吗/社交媒体营销策略有哪些
  • 商丘做网站sqlongliqi/线上推广员是做什么的
  • 企业网站个人备案吗/化妆培训
  • 114网站做推广怎么样/竞价托管资讯