【C++】模板template
🔥🔥 欢迎来到小林的博客!!
🛰️博客主页:✈️林 子
🛰️博客专栏:✈️ C++
🛰️社区 :✈️ 进步学堂
🛰️欢迎关注:👍点赞🙌收藏✍️留言
目录
- 认识模板
- function template函数模板
- class类模板
- 模板特化
- 半特化(偏特化)
- 模板原理
认识模板
模板是C++中泛型编程的基础,一个模板就是一个创建类或者函数的蓝图或者说是公式。
当使用一个vector这样的泛型类型时,或者find这样的泛型函数时,我们提供足够的信息,将蓝图转化成类或者函数。这种转化发生在编译时。
function template函数模板
比如我们想写一个swap函数来交换两个数的值,在C++中我们可以用函数重载来重载多个函数来实现对不同类型的交换。比如我们要交换int 和 double类型,那么仅仅重载一个 swap(int& x ,int& y)是不够的。还需要重载一个swap(double& x,double& y) 函数。 但如果我还想交换其他的类型,也要写出其他类型对应的函数重载。这样就显得十分麻烦。所以这时候我们就可以function template(函数模板) 来减少我们需要写的代码。
template<class T> //定义函数模板
void Swap(T& x, T& y) //T是模板参数,也就是你传入的参数
{T tmp = x;x = y; y = tmp;
}
int main()
{int i1 = 5, i2 = 10;double d1 = 5.5, d2 = 10.5;string str1 = "hello", str2 = "world";cout << "交换前:" << endl;cout << "i1 : " << i1 << " , i2 :" << i2 << endl;cout << "d1 : " << d1 << " , d2 :" << d2 << endl;cout << "str1 : " << str1 << " , str2 :" << str2 << endl;Swap(i1, i2);Swap(d1, d2);Swap(str1, str2);cout << "交换后:" << endl;cout << "i1 : " << i1 << " , i2 :" << i2 << endl;cout << "d1 : " << d1 << " , d2 :" << d2 << endl;cout << "str1 : " << str1 << " , str2 :" << str2 << endl;return 0;
}
代码运行结果:

我们写了一份代码,就可以交换所有类型,而不用频繁的去自己写函数重载。
class类模板
类模板是用来生成类的蓝图,与函数模板不同的是,编译器不能为类模板推断模板参数类型。为了使用类模板,我们必须在类名后面加<>中提供额外信息。
template <class T>
class Node
{
public:void fun(){cout << "T* : " << typeid(next).name() << endl;cout << "T : " << typeid(val).name() << endl;}
private:T* next;T val;
};int main()
{Node<int> ni;ni.fun();cout << endl;Node<double> nd;nd.fun();cout << endl;Node<char> nc;nc.fun();return 0;
}
运行结果:

此时我们就可以发现,你<>中传什么类型进去,那么你类中的T就是什么类型。这就大大的方便了我们的编码,如果没有模板,那么每个类型都要安插一个这样的类出来,是非常麻烦的。
模板特化
如果你想对不同的模板参数,做不同的处理,那么此时你可以用模板指定类型。比如你有一个正常的模板,但是当模板参数为double时想做一下特殊处理,那么我们可以再定义一个类型模板的类。这样再生成模板时会优先生成最匹配的那一项
//普通模板
template<class T>
class A
{
public:A(){cout << "T()" << endl; }
};//特化
template<>
class A<double>
{
public:A(){cout << "double()" << endl;}
};int main()
{A<int> ai;A<char> ac;A<double>ad;return 0;
}
我们来看看它们会调用哪些构造函数。

我们发现,当在其他模板参数类型时会调用T(),但是当模板参数为double时,调用的是double()。 这也就意味着当模板参数为double时,那么会优先选择最匹配的。这种行为被称为特化。
半特化(偏特化)
当你要传入的模板参数,一半需要自动推导,一半又需要自己定义时,可以使用半特化。
template<class T1,class T2>
class A
{
public:A(){cout << "A<T1,T2>" << endl; }
};template<class T1>
class A<T1,char>
{
public:A(){cout << "A<T1,char>" << endl;}
};int main()
{A<int,int> a1;A<double,char> a2;A<char,char>a3;return 0;
}
运行结果:

我们发现,只要一个模板参数对应,那么就会优先选择对应的那个。
模板原理
模板的原理其实就是根据你所传的模板参数,又给你自动生成了一个类。而这个过程在编译时发生。就比如如下这个代码。
template<class T1,class T2>
class A
{
public:T1 a;T2 b;
};int main()
{A<int,int> a1;A<double,char> a2;A<char,char>a3;return 0;
}
它在编译后实际上是这样的
class A
{
public:int a;int b;
};class A
{
public:double a;char b;
};class A
{
public:char a;char b;
};
会生成三个A类。分别对应的模板参数
A<int,int> a1;
A<double,char> a2;
A<char,char>a3;
当然,我们在编码的时候是无法用相同的类名的。但在编译时,会有类似于函数重载的机制(个人猜测)生成出多个类。
所以,函数模板的本质就是方便你编码。等编译时再为你自动生成你当初传入的模板参数时对应的类。也就是说,虽然表面上你写的代码减少了,但本质上需要的代码并没有减少。只是在编译时为你自动生成了。
相关文章:
【C++】模板template
🔥🔥 欢迎来到小林的博客!! 🛰️博客主页:✈️林 子 🛰️博客专栏:✈️ C 🛰️社区 :✈️ 进步学堂 🛰️欢…...
智能工厂:适应不断变化的制造世界
制造业已经从过去传统的装配线工艺流程中走了很长一段路。随着技术的进步和工业 4.0 的兴起,制造业正在迅速发展,以满足现代世界不断变化的需求。近年来出现的一个关键概念就是“智能工厂”。在这篇文章中,我们将探讨什么是智能工厂、它是如何…...
大数据课程I3——Kafka的消息流与索引机制
文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Kafka的消息流处理; ⚪ 掌握Kafka的索引机制; ⚪ 掌握Kafka的消息系统语义; 一、Kafka消息流处理 1. Producer 写入消息 流程说明: 1. producer 要向Kafka生产消息,需要先通过…...
LVGL学习笔记 28 - 键盘keyboard
目录 1. 设置关联文本框 2. 设置模式 2.1 LV_KEYBOARD_MODE_TEXT_LOWER 2.2 LV_KEYBOARD_MODE_TEXT_UPPER 2.3 LV_KEYBOARD_MODE_SPECIAL 2.4 LV_KEYBOARD_MODE_NUMBER 2.5 LV_KEYBOARD_MODE_USER_1 ~ LV_KEYBOARD_MODE_USER_4 3. 使能弹窗模式 4. 更改按键布局 5. 事…...
【Microsoft 支持】【数据库-MySql】当您尝试从大于 5000 的 TCP 端口连接时收到错误 WSAENOBUFS (10055)
一、转载原文 When you try to connect from TCP ports greater than 5000 you receive the error ‘WSAENOBUFS (10055)’ Symptoms If you try to set up TCP connections from ports that are greater than 5000, the local computer responds with the following WSAE…...
【学会动态规划】最长湍流子数组(23)
目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…...
【网络编程·网络层】IP协议
目录 一、IP协议的概念 二、IP协议的报头 1、四位首部长度 2、16位总长度(解包) 3、8位协议(分用) 4、16位首部校验和 5、8位生存时间 6、32位源IP和32位目的IP 7、4位版本/8位服务类型 8、16位标识 9、3位标志 10、1…...
HTML详解连载(7)
HTML详解连载(7) 专栏链接 [link](http://t.csdn.cn/xF0H3)下面进行专栏介绍 开始喽结构伪类选择器作用 :nth-child(公式)作用举例 伪元素选择器作用注意: PxCoook作用盒子模型-重要组成部分 盒子模型-边框线属性名属性…...
一文打通redis中的String类型
目录 基本介绍 基本语法 常用命令解读 概述 SETNX key value SETNX key value GETRANGE key start end GETSET key value GETBIT key offset MGET key1 [key2..] STRLEN key 基本介绍 ①String是Redis最基本的类型,一个key对应一个value。 ②String类型是二进制…...
优测云服务平台|【压力测试功能升级】轻松完成压测任务
一、本次升级主要功能如下: 1.多份报告对比查看测试结果 2.报告新增多种下载格式 Word格式Excel格式 3.新增多种编排复杂场景的控制器 漏斗控制器并行控制器事务控制器仅一次控制器分组控制器集合点 4.新增概览页面,包含多种统计维度 二、报告对比…...
UseEffect中使用setState更新后获取的值为何依然是更新前
刚开始学习React的新手经常遇到这样的问题,使用useState去更新某个数据,然后再取更新后的数据,取发现数据并没有更新。 在 React 中,useState 的更新确实是异步的,这是由 React 的内部机制所决定的。React 会对多次状…...
去掉鼠标系列之一: 语雀快捷键使用指南
其实应该是系列之二了,因为前面写了一个关于Interlij IDEA的快捷键了。 为什么要写这个了,主要是觉得一会儿用鼠标,一会儿键盘,一点儿不酷,我希望可以一直用键盘,抛开鼠标。后面陆续记录一下各个软件的快捷…...
【Linux】Reactor模式
Reactor模式 Reactor模式的定义 Reactor反应器模式,也叫做分发者模式或通知者模式,是一种将就绪事件派发给对应服务处理程序的事件设计模式。 Reactor模式的角色构成 Reactor主要由以下五个角色构成: reactor模式的角色 角色解释Handle(句…...
【LeetCode 算法】Merge Two Binary Trees 合并二叉树
文章目录 Merge Two Binary Trees 合并二叉树问题描述:分析代码PreOrder DFSPreOrder Tag Merge Two Binary Trees 合并二叉树 问题描述: 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时&#…...
系统架构设计师---2017年下午试题1分析与解答(试题五)
2017年下午试题1分析与解答 试题五 阅读以下关于Web系统架构设计的叙述,在答题纸上回答问题1至问题3. 【说明】 某电子商务企业因发展良好,客户量逐步增大,企业业务不断扩充,导致其原有的B2C商品交易平台己不能满足现有业务需求。因此,该企业委托某软件公司重新开发一套…...
el-table实现静态和动态合并单元格 以及内容显示的问题
实现效果图 <el-tablev-loading"loading":data"tableData"style"width: 100%":row-class-name"tableRowClassName"size"small"><el-table-column fixed label"序号" width"50"><el-tab…...
STM32F40X系列FSMC8路驱动LCD显示屏(LY-TFT30-39P-1509 芯片hx8352)
hx8352_8080_8bit_FMSC板级驱动 1.LCD相关1.1LCD参数1.2 LCD引脚1.3 LCD实物1.4 LCD引脚解释 2.接线关系3.STM32F40x基于FMSC16bit修改1)地址偏移2)删除多余GPIO3)修改FMSC的配置4)LCD初始化寄存器 3.板驱动程序4.运行结果 1.LCD相关 1.1LCD参数 LCD控制芯片&…...
小象课堂在线授课教育系统
此项目包含后端全部代码,前端包括后台和web界面的源码,数据库用的mysql,可当作课设或者毕设,还可写入自己的简历中 web界面展示: 前端后台界面展示: 用户管理 课程管理 内容配置 订单管理 系统管理 系统监控...
Android 电池容量获取
Android 原生设置电池容量是在 power_profile.xml 中配置,此文件默认在 frameworks 目录下,也可能有 overlay 目录文件。 <!-- This is the battery capacity in mAh (measured at nominal voltage) --><item name"battery.capacity"…...
无涯教程-Perl - tell函数
描述 此函数返回指定FILEHANDLE中读取指针的当前位置(以字节为单位)。如果省略FILEHANDLE,则它将返回上次访问的文件中的位置。 语法 以下是此函数的简单语法- tell FILEHANDLEtell返回值 此函数以字节为单位返回当前文件位置。 例 以下是显示其基本用法的示例代码,要检…...
深度解析causal-conv1d:CUDA加速的因果深度卷积专业指南
深度解析causal-conv1d:CUDA加速的因果深度卷积专业指南 【免费下载链接】causal-conv1d Causal depthwise conv1d in CUDA, with a PyTorch interface 项目地址: https://gitcode.com/gh_mirrors/ca/causal-conv1d causal-conv1d是一个专为时间序列数据优化…...
别再手动搬虚拟机了!手把手教你配置vSphere DRS集群,实现ESXi主机负载自动均衡
企业级虚拟化资源调度实战:vSphere DRS集群的智能配置与优化策略 虚拟化技术已成为现代企业IT基础设施的核心支柱,而资源的高效调度则是保障业务连续性和性能的关键。在传统虚拟化环境中,管理员往往需要手动监控主机负载并迁移虚拟机…...
2026年腾讯云OpenClaw/Hermes Agent配置Token Plan集成步骤解析
2026年腾讯云OpenClaw/Hermes Agent配置Token Plan集成步骤解析。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具&…...
Awoo Installer:任天堂Switch游戏安装的终极解决方案,3种方式快速搞定NSP/NSZ/XCI/XCZ文件
Awoo Installer:任天堂Switch游戏安装的终极解决方案,3种方式快速搞定NSP/NSZ/XCI/XCZ文件 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-…...
Sparrow比特币钱包:终极桌面安全钱包完全指南
Sparrow比特币钱包:终极桌面安全钱包完全指南 【免费下载链接】sparrow Desktop Bitcoin Wallet focused on security and privacy. Free and open source. 项目地址: https://gitcode.com/gh_mirrors/sparr/sparrow Sparrow比特币钱包是一款专注于安全与隐私…...
基于Next.js与Shadcn/ui的现代Web仪表盘开发实战指南
1. 项目概述与核心价值 最近在折腾一个开源项目,叫 openclaw-dashboard ,是 anis-marrouchi 大佬在 GitHub 上开源的一个仪表盘项目。光看名字,你可能会觉得这又是一个平平无奇的“又一个仪表盘”,但实际深入把玩之后&#x…...
声磁同步定点仪怎么选?这份选购经验干货分享
做工厂电缆故障检测、地埋电缆探测的工程人员,多半都踩过定点仪的坑:设备抗干扰差,复杂厂区地下管线密集,找半天定不准点位,开挖错位置不仅耽误工期,额外的开挖成本、停产损失动辄几万到几十万。作为常年跟…...
Illustrator智能替换工具:如何让批量设计工作变得轻松高效
Illustrator智能替换工具:如何让批量设计工作变得轻松高效 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 你是否曾经面对过这样的场景:客户要求将50个物料中…...
MPC-BE:Windows平台终极开源多媒体播放器架构深度解析与实战指南
MPC-BE:Windows平台终极开源多媒体播放器架构深度解析与实战指南 【免费下载链接】MPC-BE MPC-BE – универсальный проигрыватель аудио и видеофайлов для операционной системы Windows. 项…...
OBS高级遮罩插件:15种专业遮罩技术的完整技术解析与实战应用
OBS高级遮罩插件:15种专业遮罩技术的完整技术解析与实战应用 【免费下载链接】obs-advanced-masks Advanced Masking Plugin for OBS 项目地址: https://gitcode.com/gh_mirrors/ob/obs-advanced-masks 在视频制作与直播领域,遮罩技术是区分业余与…...
