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

C++ 模板实现单例模式

在编写sylar服务器时,遇到一种没见过的非常好的单例模式实现,找遍CSDN就只有两篇博客,还没有讲解。只好自己尝试理解。

1、singleton.h头文件代码

#ifndef __SINGLETON_H__
#define __SINGLETON_H__

/**
 * @brief 单例模式封装类
 * @details T 类型
 *          X 为了创造多个实例对应的Tag
 *          N 同一个Tag创造多个实例索引
 */
template<class T, class X = void, int N = 0>
class Singleton
{
public:
	static T* GetInstance()
	{
		static T v;
		return &v;
	}
};

/**
 * @brief 单例模式智能指针封装类
 * @details T 类型
 *          X 为了创造多个实例对应的Tag
 *          N 同一个Tag创造多个实例索引
 */
template<class T, class X = void, int N = 0>
class SingletonPtr
{
public:
	static std::shared_ptr<T> GetInstance()
	{
		static std::shared_ptr<T> v(new T);
		return v;
	}
};

#endif

2、说明

模板类型参数

第一个要说明的点就是模板类型参数class X = voidint N = 0的作用。他们能使得 对于同一个类型T,产生多个实例,产生多个实例后,可以用这两个参数来索引这些实例。但这是和单例模式的思想冲突的。而且在整个sylar服务器框架中所有用到该模板的地方,也确实没有使用到这两个参数。

如果有大佬知道这两个参数的其他意义烦请在评论区留言,非常感谢。

如何实现的单例模式

这个只要请搞清楚静态局部变量的内存分配和初始化方式即可,参考下面我的另一篇博客。
C++中全局变量,静态变量,静态局部变量 的初始化和内存分配问题

3、

这个单例模式的强大之处在于它具有很高的复用性,sylar服务器中也确实有很多需要用单例模式的类都使用了该模板。

4、一个简单的实验

#include<iostream>
#include<stdio.h>

using namespace std;

class X
{
public:
	void func() { cout << "XXXXXXXXXXX" << endl; }
};

class Y
{
public:
	void func() { cout << " YYYYYYYYYY" << endl; }
};

template<class T, class X = void, int N = 0>	// X:为了创造多个实例对应的 Tag
class Singleton					// N:同一个 Tag 创造多个实例索引
{
public:
        static T* GetInstance()
        {
                static T v;
		static int x;
		x++;
		printf("x = %d\tX: %p\n", x, &x);
                return &v;
        }
};

int main()
{
	X* x1 = Singleton<X>::GetInstance();
	x1->func();
	
	X* x2 = Singleton<X, Y>::GetInstance();
	x2->func();

	X* x11 = Singleton<X>::GetInstance();
	x11->func();

	printf("%p\n%p\n%p\n", x1, x2, x11);

	return 0;
}

输出:
在这里插入图片描述

相关文章:

  • 《C++ Primer》 异常
  • C++父类和子类指针的相互赋值和转换
  • 算法设计与分析————期末死亡冲刺
  • 现代软件工程————期末死亡冲刺
  • std::string::npos 常量解析
  • 练习4-3 求给定精度的简单交错序列部分和 (15 分)本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。
  • 浙大版《C语言程序设计(第4版)》题目集 练习4-6 猜数字游戏 (15 分)
  • 练习4-7 求e的近似值 (15 分)自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。
  • 数组输入输出的方法
  • 习题:贴邮票
  • 习题:遍历搜寻
  • 习题:哥德巴赫猜想
  • 习题:数字拆分
  • 习题:质数统计
  • 商品管理系统超详细讲解
  • [PHP内核探索]PHP中的哈希表
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【comparator, comparable】小总结
  • 03Go 类型总结
  • Angular 4.x 动态创建组件
  • ES6简单总结(搭配简单的讲解和小案例)
  • JavaScript设计模式与开发实践系列之策略模式
  • JavaWeb(学习笔记二)
  • Logstash 参考指南(目录)
  • nginx 负载服务器优化
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • 阿里云前端周刊 - 第 26 期
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 创建一种深思熟虑的文化
  • 番外篇1:在Windows环境下安装JDK
  • 规范化安全开发 KOA 手脚架
  • 模型微调
  • 区块链分支循环
  • 如何合理的规划jvm性能调优
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 小程序01:wepy框架整合iview webapp UI
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • ionic异常记录
  • ​决定德拉瓦州地区版图的关键历史事件
  • # 计算机视觉入门
  • #{}和${}的区别是什么 -- java面试
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (30)数组元素和与数字和的绝对差
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)Linux下编译安装log4cxx
  • (转)VC++中ondraw在什么时候调用的
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • ..回顾17,展望18
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Mobi域名介绍