奇异递归模板模式应用1-对象计数

news/2024/6/17 7:44:21 标签: c++, 模板元编程

需求:有时遇到某些类特征相似而又没有共同的父类,希望能够知道这些类的创建数量之和。
思路:将这些类继承自同一个计数类,共享计数变量s_createCount信息,实现如下:

class Counter
{
public:
	Counter() {
		++s_createCount;
		++s_aliveCount;
		std::cout << "Class Created Count = " << s_createCount << " Class Alive Count = " << s_aliveCount << std::endl;
	}
	~Counter() {
		--s_aliveCount;
		std::cout << "Class Alive Count = " << s_aliveCount << std::endl;
	}

private:
	static int s_createCount;
	static int s_aliveCount;
};

int Counter::s_createCount = 0;
int Counter::s_aliveCount = 0;

class CounterA : public Counter{};
class CounterB : public Counter {};

int main()
{
	CounterA ca;
	CounterB cb;
	{
		CounterA ca2;
	}
	system("pause");
	return 0;
}

在这里插入图片描述
需求:有时遇到某些类,希望能够分别知道各个类的创建数量信息(兼容需求1)。
思路:既然继承同一个类会导致共享静态数据,那么可以依靠类模板的特性(只要模板参数不同,类就不同),继承不同的类,实现如下:

template <typename T>
class Counter
{
public:
	Counter() {
		++s_createCount;
		++s_aliveCount;
		std::cout << __FUNCTION__ << "Class Created Count = " << s_createCount << " Class Alive Count = " << s_aliveCount << std::endl;
	}

	~Counter() {
		--s_aliveCount;
		std::cout << __FUNCTION__ << "Class Alive Count = " << s_aliveCount << std::endl;
	}

private:
	static int s_createCount;
	static int s_aliveCount;
};

template <typename T>
int Counter<T>::s_createCount = 0;
template <typename T>
int Counter<T>::s_aliveCount = 0;

// 这里不必考虑CRTP易错点(兼容需求1):派生的基类模板参数不是派生类
// 允许class CounterB : public Counter<CounterA> {};的情况存在
// 因为不涉及将模板参数T转换为派生类的操作
class CounterA : public Counter<CounterA> {};
class CounterB : public Counter<CounterB> {};

int main()
{
	CounterA ca;
	CounterB cb;
	CounterC cc;
	{
		CounterA ca2;
	}
	system("pause");
	return 0;
}

在这里插入图片描述


http://www.niftyadmin.cn/n/5376867.html

相关文章

CTFshow web(文件上传151-154)

web151 哈&#xff0c;都直接送嘴边了&#xff0c;前端检测领域的问题&#xff0c;那就改前端啊&#xff0c;作者都直接提示了&#xff01; 第一种方法也是最好用的就是直接把前端内容的png改成php就好 这里教大家一个非常好用的技巧&#xff0c;可以极大节省你的时间&#xf…

【深度学习】S2 数学基础 P3 微积分(上)导数与微分

目录 圆与微积分导数与微分导数的含义数学定义常用函数微分常用微分法则Python 实现 圆与微积分 公元前 2500 年&#xff0c;古希腊数学家阿基米德通过一种名为 “逼近法” 的技巧来估算圆的面积。他采用一个有奇数边的正多边形来外切圆&#xff0c;并用一个有偶数边的正多边形…

【leetcode】深搜、暴搜、回溯、剪枝(C++)2

深搜、暴搜、回溯、剪枝&#xff08;C&#xff09;2 一、括号生成1、题目描述2、代码3、解析 二、组合1、题目描述2、代码3、解析 三、目标和1、题目描述2、代码3、解析 四、组合总和1、题目描述2、代码3、解析 五、字母大小写全排列1、题目描述2、代码3、解析 六、优美的排列1…

[缓存] - 2.分布式缓存重磅中间件 Redis

1. 高性能 尽量使用短key 不要存过大的数据 避免使用keys *&#xff1a;使用SCAN,来代替 在存到Redis之前压缩数据 设置 key 有效期 选择回收策略(maxmemory-policy) 减少不必要的连接 限制redis的内存大小&#xff08;防止swap&#xff0c;OOM&#xff09; slowLog …

项目访问量激增该如何应对

✨✨ 欢迎大家来到喔的嘛呀的博客✨✨ &#x1f388;&#x1f388;希望这篇博客对大家能有帮助&#x1f388;&#x1f388; 目录 引言 一. 优化数据库 1.1 索引优化 1.2 查询优化 1.3 数据库设计优化 1.4 事务优化 1.5 硬件优化 1.6 数据库配置优化 二. 增加服务器资源…

使用一根网线,让Ubuntu和正点原子I.MX6ULL开发板互相ping通

1.硬件准备 准备一根网线即可 2. 让windows和I.MX6ULLping通 2.1 找根网线将I.MX6ULL和电脑连起来 2.2 让I.MX6ULL通电运行起来&#xff0c;我这里使用的是正点原子版本的内核、 2.3 进入电脑的网络连接后&#xff0c;按照如下步骤操作 2.4 将ip地址、子网掩码、默认网关…

html的格式化标签和图片(img)标签

格式化标签 加粗: strong标签和b标签倾斜: em标签和i标签删除线: del标签和s标签下划线: ins标签和u标签 <strong>stong 加粗</strong><b>b 加粗</b><em>倾斜</em><i>倾斜</i><del>删除线</del><s>删除线…

位运算总结(Java)

目录 位运算概述 位运算符 位运算的优先级 位运算常见应用 1. 给定一个数n&#xff0c;判断其二进制表示中的第x位是0还是1 2. 将数n的二进制表示中的第x位修改为1 3. 将数n的二进制表示中的第x位修改为0 4. 位图 例题&#xff1a;判断字符是否唯一 5. 提取数n的二进制…