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

C++11单例模板完全解决方案 class SingletonClass { private: SingletonClass() = default; ~SingletonClass() = default; SingletonClass(const SingletonClass& singletonClass) = delete; SingletonClass&operator... 阅读详情

单例模式

该示例代码采用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;
}

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

使用C++11实现线程安全的单例模式 C++11实现线程安全的单例代码和测试代码,包含singleton.h,main.cpp,希望帮助到大家。 立即下载

相关推荐

华为海思IC设计岗位笔试全解析:物理、电路与工艺三大方向备考指南

本文全面解析华为海思IC设计岗位笔试的物理、电路与工艺三大方向备考要点。针对物理设计方向,重点讲解半导体能带理论、载流子输运机制等核心考点;电路设计方向涵盖Verilog语法、UVM验证等关键技术;工艺方向则深入探讨FinFET工艺、光刻技术等前沿知识。提供高效备考策略和应试技巧,助力考生提升通过率。

weixin_29196613的博客 1084

CUDA Bug <一>

问题描述: 错误 23 error : no instance of function template “getgriddim” matches the argument list dim3 dimGrid(getgriddim(num_vec, (size_t)dimBlock.x)); getgriddim函数定义如下 #pragma once #include <algorithm> template<typename T> __host__ __device__ T

Super5311的博客 860

Windows平台MuJoCo仿真环境配置与Qt集成实战

本文详细介绍了在Windows平台上配置MuJoCo物理仿真环境并与Qt框架集成的完整实战流程。内容涵盖从环境准备、库文件配置、项目创建到核心代码编写的每一步,重点解决了Windows下常见的编译链接错误和路径问题,帮助开发者在Windows系统中高效搭建机器人仿真与可视化控制开发环境。

weixin_29221753的博客 170

设计模式——C++11实现单例模式(饿汉模式、懒汉模式),与单例的进程

C++11:线程不安全、多次加锁、单次加锁、不加锁实现单例模式。介绍饿汉模式和懒汉模式。最后实现一个单例的进程

chfens的博客 1846

TDDFT计算软件Octopus学习笔记(二):基态计算(Si)

本文以硅为例,来进行基态计算。

陈啸的博客 7305

新能源充电桩充电枪口标准

建立的标准确保了新能源汽车充电的安全性、兼容性和效率,促进了新能源汽车产业的发展。

网络安全的研究者、新能源行业的追求者 4686

[C++]c++11如何实现单例模式

在C++11中可以使用`std::call_once`函数来保证线程安全,该函数只会被调用一次。在`getInstance()`函数中,首先检查`instance`是否已经被创建,如果没有,则调用`std::call_once`函数创建对象。可以使用加锁的方式来保证线程安全,但会影响程序的性能。在C++11中实现单例模式的方法有很多种,下面介绍几种常见的实现方式。此方法简单明了,但如果单例对象很大,可能会影响程序的启动速度。的几种常见方法,具体实现方式可以根据实际需求选择不同的方法。作者:嵌入式开发小杰。

FL1768317420的博客 1038

微信小程序 - 最新实现项目适老化设计全流程及源码,老年模式大字版与常规版页面样式切换,老年人大字模式字体与布局更换关怀版解决方案(新老项目均适用的方案,全局页面统一修改文本字号/DOM排版元素等)

微信小程序,vue2,vue3,老年大字版设计,小程序开发如何实现适老化方案,放大字体字号及改变页面的布局,小程序关怀模式实现思路及代码,统一将布局都改了,全局修改字体大小适配老年人看不清问题,小程序怎么接入老年模式并根据模式改变页面的UI设计,实现全局修改字体大小适老化/关怀版改造,最新详细示例代码全流程,字体放大/缩小,老项目怎么适配老年人模式方案,小程序适老化设计指南,当切换成老年模式时页面所有排版都会发生变化,小程序vue开发,新手详细教程,老年模式字体设置思路和UI布局的设计,开发者可以通过wx.

🏆 前端领域优质创作者 7307

设计模式学习——简介

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问...

weixin_30511039的博客 306

lammps教程:聚合物压缩,避免“bond atoms missing”

如果使用ms建模,聚合物的链会伸出到盒子外面,在导出data文件后,盒子外面的原子被周期性算法折叠进盒子对面,这就造成了边界附近的bond原子可能被分布到了盒子的两侧。并且,这个data文件不能使用npt系综进行压缩,npt系综必须使用周期性边界,在压缩时,bond原子同样会移动到对面的边界。所以,最好的解决办法是使用一个反射墙墙进行压缩,设置一个反射墙墙既可以实现压缩效果,也可以组织原子跨越box边界移动到对面。解决这个问题的原则只有一个:导出data时确保所有的bond原子没有跨越边界。

lammps_jiayou的博客 3819

在jetson上对fastdeploy进行源码编译(完整版)

在大多数Linux发行版中,你可以使用包管理器安装Python开发包。根据jetpack的版本选择对应的推理库版本。在~/.bashrc中写入这三行。

如果想成为中心,那么就到中心去吧。 678

编译maskscoring_rcnn出现ROIAlign_cuda.cu(275): error: no instance of function template “THCCeilDiv“解决办法

问题描述 在安装官网上的教程编译maskscoring_rcnn时,在执行到最后一步python setup.py build develop,最后竟然出现了下面问题 C:/Users/Administrator/Documents/maskrcnn-benchmark/maskrcnn_benchmark/csrc/cuda/ROIAlign_cuda.cu(275): error: no in...

无名何许人的博客 1538

中兴交换机如何配置?有哪些常用的配置命令,本文值得收藏!

中兴交换机是一种常见的网络设备,用于构建和管理企业网络。它提供了丰富的功能和灵活的配置选项,使网络管理员能够根据特定需求进行定制化配置。本文将详细介绍中兴交换机的配置过程,包括登录、基本设置、VLAN配置、接口配置和安全配置等内容。

网络技术联盟站 1万+

使用C++11的可变参数模板改造单例模式

本人以前写过一个C++的单例模式(见此 设计模式C++之单例),想法很简单,不值一提。 最近,看了C++11的新特性中有可变参数模板,想到是否可以以此来改造单例模式。参考了网上的一些经验,写了一个大多数情况下可以通用的一个单例模式,以此记录。template <typename T> class SingleTon { public: // 创建单例实例 template<type

kestiny的专栏 2711

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++11实现单例模式

C++11通过可变模板参数实现单例模式

guicaifjz的博客 1245

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

设计模式——单例模式(C++11实现)

C++11实现泛型单例模式,支持任意参数类的对象创建。采用了C++11的可变参数模板和完美转发技术 #include <iostream> #include <string> #include <stdexcept> using namespace std; //单例类,包含任意参数的类实例。 template <typename T> class Singleton { public: template <typename... Arg

Skynet的博客 917

spdlog日志库的模板封装

关于spdlog的基本介绍,可以查看GitHub官方介绍,这里不做过多阐述。主要集中于将spdlog用C++11的特性进行一个封装,简化使用或替换旧工程的日志库。 spdlog库在不同文件使用的时候,为避免每个文件都需要重新定义一下。所以可把它封装在一个log.h的头文件中,这样,就可以直接使用了。 这里使用了单例的设计模式,避免重复创建。同时,使用了可变参数模板,将参数传入WriteLog通过完美转发std::forward到spdlog里面,因为spdlog本身也是一个可变参数模板。 #pragma o

L-Super的博客 1998

C++ 11

是⼀个表⽰数据的表达式(如变量名或解引⽤的指针),⼀般是有持久状态,存储在内存中,我 们可以获取它的地址,左值可以出现赋值符号的左边,也可以出现在赋值符号右边。饿汉模式的缺点:问题1:很多单例类,都是饿汉模式,有些单例对象初始化资源很多,导致程序启动慢,迟迟进不了main函数,问题2: 如果两个单例类有初始化依赖关系,饿汉也无法解决。也是⼀个表⽰数据的表达式,要么是字⾯值常量、要么是表达式求值过程中创建的临时对象 、匿名对象等 ,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,

weixin_45150754的博客 846

C++11改进单例模式

C++11改进单例模式

qq_25048473的博客 489

用c++11做单例模式

#include &lt;iostream&gt; #include &lt;mutex&gt; using namespace std; template&lt;class T&gt; class Singleton { public: template&lt;class... Params&gt; static void init(Params&amp;&amp;... params) ...

dong_beijing的博客 1219

c++11总结07——改进单例模式

泛型单例存在的问题: 泛型单例要能够创建所有的类型对象,但是这些类型的构造函数形参不尽相同,参数个数和参数类型可能都不相同,导致我们不容易做一个所有类型都通用的单例。 c++11借助可变参数模板实现单例(上代码) #include <iostream> using namespace std; template <typename T> class Singleton { public: template<typename... Args> //可变参数

www_dong的博客 573

C++11与设计模式的交流

单例模式 针对多个参数的单例模式,使用变长类型的模版 template<T> class Singleton{ public: template<typename ... Args> static T* Instance(Args... args){ if(m_pInstance==nullptr){ m_pInstance=new T(); } return m_pinstance; } } ...

CodeMyDream的专栏 237

C++11 使用智能指针改进单例模式

本文主要关于如何使用C++11的智能指针改进单例模式。智能指针在C++11版本之后提供,包含在头文件中,shared_ptr、unique_ptr、weak_ptr。设计初衷:线程安全、垃圾回收、单例对象可接受多个参数。 1、使用shared_ptr 相对于一般的单例实现而言,使用了可变参数模板使得单例对象可接受多个参数: #pragma once #include <mutex> #include <memory> template<typename T> class

HelloKandy's Blog 7386

C++模板STL

由于是逗号表达式,在创建数组的过程中会先执行逗号表达式前面的部分printarg(args)打印出参数,也就是说在构造int数组的过程中就将参数包展开了,不过这个数组的目的纯粹是为了在数组构造的过程展开参数包。这种方式很好理解,即每次都调出来一个参数(相当于每一次都隔离出来一个参数,然后剩下的参数作为下一层函数的参数包)上面的参数args前面有省略号,所以它就是一个可变模版参数,我们把带省略号的参数称为“参数。只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特。

LuckyStar的博客 299

单例模式之懒汉、饿汉以及C++11中的单例模式

文章目录单例模式分为两种懒汉模式一:双检索+自动回收懒汉模式二:静态局部变量,避免自己回收资源饿汉模式一饿汉模式二(boost实现)C++11中借助可变参数模板实现的单例 单例模式分为两种 懒汉模式:第一次调用时才初始化,有延迟加载的效果,以时间换空间 优点:第一次使用实例对象时,创建对象。进程启动无负载。多个单例实例启动顺序自由控制。 缺点:复杂 饿汉模式:程序开始就初始化,以空间换时...

你又来看我了,一起学习吧 1738

记录篇-C++11应用-改进模式

C++11改进模式前言 前言 本文是记录个人对c++11读写相关的学习,文中所用可能会采用其他大神的图、思路、例子等,请大神们见谅。本博客文章是在学习过程的一些总结,整理出来,分享给大家,希望对各位读者有帮助,文章中的总结可能存在很多不完整或有错误的地方,也希望读者指出。 ...

u014801568的博客 458
上一篇: Muduo库编译学习(1)
下一篇: Linux C++编译及g++使用操作
照书抄代码
博客等级 码龄8年 32粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值