C++ template的使用

2023-11-06

1、template的使用

C++ 的高级玩法,当然包含了模板。模板(template)是实现代码重用机制的一种工具,它可以实现类型参数化,把类型定义为参数(模板元编程),从而实现了真正的代码可重用性。

模板是用来批量生成功能和形式都几乎相同的代码的。编译器就能在需要的时候,根据模板自动生成程序的代码。从同一个模板自动生成的代码,形式几乎是一样的。 模板就像一个做饼干的模具,至于饼干是什么味道,则要看具体实例化时制作饼干的材料。

模板可以分为两类,一个是函数模板,另外一个是类模板

1.1、函数模板

函数模板比较简单,下面我们来看一个两者交换的例子就明白了:

template<typename T>
void swap(T& t1, T& t2)
{
	T temp = t2;
	t2 = t1;
	t1 = temp;
}

1.2、类模板

类模板比函数模板稍微复杂一下,主要是实现时的书写,如下面的代码:

//stack.h
template<typename T>
class Stack
{
public:
	Stack();
	~Stack();
	void push(T t);
	T pop();
	bool isEmpty();
private:
	T* m_pT;
	int	m_maxSize;
	int m_size;
};

//Stack.cpp
#include "Stack.h"

template<typename T>
Stack<T>::Stack()
{
	m_maxSize = 100;
	m_size = 0;
	m_pT = new T[m_maxSize];
}

template<typename T>
Stack<T>::~Stack()
{
	delete[] m_pT;
	m_pT = nullptr;
}

template<typename T>
void Stack<T>::push(T t)
{
	m_size++;
	m_pT[m_size - 1] = t;
}

template<typename T>
T Stack<T>::pop()
{
	T t = m_pT[m_size - 1];
	m_size--;
	return t;
}

template<typename T>
bool Stack<T>::isEmpty()
{
	return m_size == 0;
}

上述类模板是模仿了一个栈,这个栈很简单,最多只能支持100个元素入栈。

通过上面的例子可知,在类模板中,通用类型可以作为普通成员变量,也可以作为成员函数的参数和返回值

2、模板的实例化与具象化

2.1、实例化

模板的实例化有两种形式,分别是 显示实例化隐式实例化

显示实例化 就是直接命令编译器创建特定的实例。在使用模板之前,编译器会根据显示指定的类型生成模板实例。显示实例化有两种写法,具体如下:

template void swap2<int>(int& a, int& b); //声明时显示实例化,只需要声明,不需要实现

int a = 1, b= 2;
swap<int>(a, b);	//使用时显示实例化

隐式实例化 类似普通的函数调用,在使用模板时,根据使用的类型,编译器进行推导,生成相应类型的实例。方便程序员的书写,但是增加编译器的负担。如下所示:

swap(a, b);	//隐式实例化,和显示实例化的结果是一样的

2.2、具象化(专业化)

具象化就是模板中特化性质。例如上面书写的交换函数,如果传入的是char* 类型,使用 = 操作只是复制了指针数据,指针指向的内存有可能会失效,所以 = 操作可能会出现问题,我们需要进行单独的操作。如下:

template<>
void swap2(char*& a, char*& b)
{
//具象化
.....
}

具象化的定义应该在有常规模板的情况下,以 template<> 打头,通过名称来指出类型,并必须要有具体的实现

函数在调用的过程时,编译器调用顺序是:常规函数 > 具体化模板函数 > 常规模板

3、其它

一个类没有模板参数,但是成员函数有模板参数是可行的。代码如下:

class Util
{
public:
	template<class T>
	bool equal(T t1, T t2)
	{
		return t1 == t2;
	}
};

int main()
{
	Util aab;
	std::cout << aab.equal<int>(a, b) << std::endl;
	std::cout << aab.equal(1, 1) << std::endl;
}

在类模板的例子中栈的最大元素数量是写死的,可以使用模板的偏特化特性来自定义元素的最大数量。如下所示

template<typename T, int maxsize = 100>
class Stack
{
	//和上面的例子一样
	.....
}

template <class T,int maxsize>	//这里和上面的不一样
Stack<T, maxsize>::Stack()
{
   m_maxSize = maxsize;      	//最大数量通过外面传入
   m_size = 0;
   m_pT = new T[m_maxSize];
}

int main()
{
	int maxsize = 1024;
	Stack<int,1024> intStack;
	for (int i = 0; i < maxsize; i++) 
    	intStack.push(i);
}

感谢大家,我是假装很努力的YoungYangD(小羊)
参考文档:
https://www.cnblogs.com/yangxiaoping/p/8268209.html
https://blog.csdn.net/qq_30835655/article/details/76850894

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ template的使用 的相关文章

  • fastcgi的环境变量

    FCGI ROLE RESPONDER SCRIPT FILENAME scripts 5 cgi QUERY STRING aaa 11111111111111 bbb 2222222222222222 ccc 3333333333333
  • C++知识积累:内存对齐理解

    为什么要进行内存对齐 这是因为CPU的读取总是对齐的 举个例子 假设CPU是32位的 那么CPU每次读取的4字节数据的首地址都是4的倍数 也就是说 内存中数据首地址为4的倍数时 CPU一次操作就可以完成数据读取 假设有一个int型四字节大小
  • Qt5学习之路(vs2012下创建一个QT应用程序)2013-10-14

    刚开始学习QT在网上找的资料基本都是使用QT Create进行开发的 VS下开发的学习资料感觉很少很难找的到 视频教程也基本没看到过貌似 因为我们研发中心是使用MFC进行开发开发工具是VS2010 使用QT开发的话基本我们不会再使用QT C
  • 多线程系列之——事件内核对象

    所有内核对象里面事件内核对象是最简单的一个 它包括一个使用计数 还有两个布尔值 一个布尔值用来表示事件是手动重置事件还是自动重置事件 另一个布尔值表示当前是否处于触发状态 当一个手动重置事件被触发的时候 所有等待该事件的线程都能变成调度状态
  • 写时拷贝技术(copy-on-write)

    传统的fork 系统调用直接把所有的资源复制给新创建的进程 这种实现过于简单并且效率低下 因为它拷贝的数据也许并不共享 更糟的情况是 如果新进程打算立即执行一个新的映像 那么所有的拷贝都将前功尽弃 Linux的fork 使用写时拷贝 cop
  • c++得到窗口句柄

    include
  • typedef struct 用法详解

    typedef为C语言的关键字 作用是为一种数据类型定义一个新名字 当typedef与结构结合使用时 会有一些比较复杂的情况 而且在C语言和C 里面有略有差别 本文将详细讲解typedef struct的用法 第一篇 typedef str
  • C/C++中浮点数格式学习——以IEEE75432位单精度为例

    这是浮点数的通常表示形式 在IEEE754中 单精度浮点数有如下形式 32位单精度 单精度二进制小数 使用32个比特存储 1 8 23位长 S Exp Fraction 31 30至23偏正值 实际的指数大小 127 22至0位编号 从右边
  • 【C++】VS code如何配置使用C++(手把手教学)

    博 主 米码收割机 技 能 C Python语言 公众号 测试开发自动化 获取源码 商业合作 荣 誉 阿里云博客专家博主 51CTO技术博主 专 注 专注主流机器人 人工智能等相关领域的开发 测试技术 VS code如何配置使用C 手把手教
  • 经典面试题之new和malloc的区别

    new和malloc的区别是C C 一道经典的面试题 我也遇到过几次 回答的都不是很好 今天特意整理了一下 0 属性 new delete是C 关键字 需要编译器支持 malloc free是库函数 需要头文件支持 1 参数 使用new操作
  • GDAL多光谱与全色图像融合简单使用

    目录 简述 C 代码 效果对比 GDAL融合效果和原始多光谱波段对比 GDAL融合效果和原始全色波段对比 ARCGIS融合效果与原始全色和多光谱对比 GDAL融合效果与ArcGIS融合效果对比 简述 最近在GDAL的代码中看见了gdalpa
  • Lua和C++交互总结(很详细)

    出处 http blog csdn net shun fzll article details 39120965 一 lua堆栈 要理解lua和c 交互 首先要理解lua堆栈 简单来说 Lua和C c 语言通信的主要方法是一个无处不在的虚拟
  • 【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)<转>

    干货 Chrome插件 扩展 开发全攻略 不点进来看看你肯定后悔 写在前面 我花了将近一个多月的时间断断续续写下这篇博文 并精心写下完整demo 写博客的辛苦大家懂的 所以转载务必保留出处 本文所有涉及到的大部分代码均在这个demo里面 h
  • lua和测试(一)

    lua做为一门高级语言 在游戏产业运用到机会越来越多了 测试掌握几门脚本语言也有一定的重要性 以下对于lua组合输入做出一些引导 测试需要掌握的关于返回数值 主要用到布尔类 前言的指引 lua的语法比较简单和清晰 学过c语言的可以很好的掌握
  • 手把手教你如何写一个三子棋/N子棋的小游戏

    这里写目录标题 第一步 游戏进入界面 第二步 初始化棋盘 第三步 打印棋盘 第四步 玩家和电脑下棋 第五步 判断输赢 三子棋或者N子棋怎么写 让我们先来玩一把 再来看看怎么写 程序运行界面 1为玩游戏 2为清屏 0为退出游戏 我们选1 然后
  • stat 函数解析

    stat 函数的简单使用 stat 函数是用来获取文件的各种属性的一个linux下的常用API函数 函数原型为int stat const char path struct stat buf stat定义如下 struct stat dev
  • enable_shared_from_this使用介绍

    文章目录 enable shared from this定义 使用场合 源码实现 注意 enable shared from this定义 定义于头文件 template lt class T gt class enable shared
  • Java反序列化漏洞-CC1利用链分析

    文章目录 一 前置知识 1 反射 2 Commons Collections是什么 3 环境准备 二 分析利用链 1 Transform
  • C++中的引用

    一 引用的概念 引用不是新定义一个变量 而是给已有变量取一个别名 编译器不会为引用变量开辟内存空间 而和它引用的变量共用一块内存空间 注意 由于C 兼容C 所以 既可以是引用符号 也可以是取地址 int a 0 int b a cout l
  • C中的内存使用问题

    请帮忙 操作系统 Linux 其中 sleep 1000 中 此时 top 显示Linux任务 给我写了7 7 MEM使用 valgrind 未发现内存泄漏 我明白 写得正确 所有 malloc 结果都是 NULL 但是为什么这次 睡眠 我

随机推荐

  • verilog搭建16位加法器记录时钟信号、实现24小时时钟

    构建一个4位BCD计数器 每个十进制数字用4位编码 q 3 0 是个位 q 7 4 是十位 以此类推 对于数字 3 1 也输出一个enable信号 表示什么时候需要增加上面三位数字 参考输出 代码 module top module inp
  • 通过uvm_printer的print_generic进行扩展打印

    uvm的field automation机制实现的其中一项功能就是sprint功能 该函数通过调用do print函数实现 在某些情况的 uvm的打印功能不是我们所期望的 比如多维数组的field automation机制就不支持 stru
  • k8s集群部署(rke + rancher)

    部署环境说明 cat etc redhat release CentOS Linux release 7 9 2009 Core 一 使用rke命令安装 k8s集群 1 在所有节点上安装chronyd服务 yum y install chr
  • 【LeetCode3】无重复字符的最长子串(滑动窗口)

    窗口维护的是无重复字符的最长子串 c int lengthOfLongestSubstring string s vector
  • linux下挂载和卸载cdrom

    1 查询块设备及mount位置 root slave143 lsblk NAME MAJ MIN RM SIZE RO TYPE MOUNTPOINT sr0 11 0 1 3 6G 0 rom type rom表示sr0为 cdrom设备
  • Java生成某段时间内的随机时间

    上代码 1 import java text SimpleDateFormat 2 import java util Date 3 4 public class DateUtil 5 6 7 生成随机时间 8 9 param beginDa
  • Linux部署vue项目

    一 nginx conf配置文件位置 etc nginx nginx conf 二 nginx的常用命令 1 启动 Nginx start nginx 或 systemctl start nginx 2 关闭 Nginx nginx s s
  • 【2023最全最新教程】RobotFramework的介绍与环境搭建(超详细~)

    本文使用的环境 win10系统 python3 6 一 RobotFramework介绍 1 1 框架基本介绍 1 Robot Framework 简称RF 是基于python编写的 开源的 功能自动化框架 2 RF是一款关键字驱动的测试框
  • STM32外设芯片驱动学习记录 —— (一) BH1750光照传感器驱动开发

    目录 一 芯片介绍 二 Datasheet解读 1 硬件说明 2 寄存器说明 3 通信过程 三 驱动代码编写 1 软件I2C驱动 2 BH1750芯片驱动函数 总结 一 芯片介绍 BH1750是16位数字输出型 环境光强度传感器集成电路 使
  • VanillaNet实战:使用VanillaNet实现图像分类(二)

    文章目录 训练部分 导入项目使用的库 设置随机因子 设置全局参数 图像预处理与增强 读取数据 设置Loss 设置模型 设置优化器和学习率调整算法 设置混合精度 DP多卡 EMA 定义训练和验证函数 训练函数 验证函数 调用训练和验证方法 运
  • 1.1python中print的使用方法

    1 对于初学者开始学习python 首先应该学会的就是对python中的print用法 学习一个函数 首先需要知道该函数的使用方法 使用参数以及使用后的结果 本文以pycharm解释器对python中函数print 做出以下解释 1 打开p
  • 赣榆高中2021高考成绩查询,赣榆中考成绩查询2021

    2021赣榆中考成绩查询时间方法 91中考网消息 2021年赣榆中考即将开始 在中考后 广大考生最关心的无疑就是中考成绩查询方法 赣榆中考成绩什么时候公布 根据往年经验 小编收集整理了2021赣榆中考成绩查询时间方法 具体如下 2021赣榆
  • 数字黑洞 C语言

    题目 给定任一个各位数字不完全相同的 4 位正整数 如果我们先把 4 个数字按非递增排序 再按非递减排序 然后用第 1 个数字减第 2 个数字 将得到一个新的数字 一直重复这样做 我们很快会停在有 数字黑洞 之称的 6174 这个神奇的数字
  • java: javamail 1.6.2 using jdk 19

    版权所有 2022 涂聚文有限公司 许可信息查看 描述 数据库 Ms SQL server 2019 IDE Eclipse IDE for Enterprise Java and Web Developers 2021 09 OS Win
  • Vue中打包压缩插件:compression-webpack-plugin

    1 http gzip 介绍 Encoding type gzip GNU zip 压缩格式 也是互联网上最流行的压缩格式 deflate zlib deflate 压缩格式 流行程度仅次于 gzip br 一种专门为 HTTP 优化的新压
  • Jmeter集合点

    一 集合点简介 1 我们怎么实现真正的并发 并发 指的是系统中真正操作业务的用户 在jmeter中 称为线程数 jmeter中 各个线程 用户 在进行业务操作中的顺序存在一定的随机性 2 集合点的目的 让各个线程 用户 步调一致 对系统进行
  • 小记跨域相关问题

    注解 CrossOrigin 支持跨域 跨域 不同的域名A 访问 域名B 的数据就是跨域 端口不同 也是跨域 loalhost 18081 gt localhost 18082 协议不同 也是跨域 域名不同 也是跨域 协议一直 端口一致 域
  • Verilog小心得

    一 概念 阻塞赋值 在always过程块中 当存在多条阻塞赋值语句时 在前面的赋值语句没有完成之前 后面的语句就不能被执行 阻塞赋值语句顺序执行 就像被阻塞了一样 因此被称为阻塞赋值 非阻塞赋值 lt 在always过程块中 当存在多条阻塞
  • Golang——从入门到放弃

    文章目录 一 golang 简介 1 go 语言特点 2 go 语言应用领域 3 使用 go 语言的公司有哪些 二 安装 golang 1 golang 下载安装 2 配置环境变量 三 golang 开发工具 1 安装 VSCode 2 下
  • C++ template的使用

    1 template的使用 C 的高级玩法 当然包含了模板 模板 template 是实现代码重用机制的一种工具 它可以实现类型参数化 把类型定义为参数 模板元编程 从而实现了真正的代码可重用性 模板是用来批量生成功能和形式都几乎相同的代码