C++——模板

目录

泛型编程

函数模板

函数模板概念

函数模板格式

类模板

类模板的定义格式

类模板的实例化


泛型编程

        泛型编程是什么呢?泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。型就是类型,不管是内置类型还是自定义类型,他们在类中还是在函数中都有他们的一席之地,在之前的学习中,已经知道了函数重载。

void Swap(int &left, int &right)
{int temp = left;left = right;right = temp;
}
void Swap(double &left, double &right)
{double temp = left;left = right;right = temp;
}
void Swap(char &left, char &right)
{char temp = left;left = right;right = temp;
}

函数重载已经帮我们实现了这一功能,但是还有美中不足的地方:

  1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数。这里只有三个类型,但是以后的应用场景可不止三个类型
  2. 代码的可维护性比较低,一个出错可能所有的重载均出错。

        这个时候就有了一个东西叫做“模板”,说白了就是一个“模子”,让编译器根据不同的类型利用这个“模子”来生成代码。更容易懂的一个说法就是我们中国的四大发明中的活字印刷,先把每个字的模型造出来,之后可以重复的使用。


函数模板

函数模板概念

        函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

函数模板格式

// template<typename T1, typename T2, ......,typename Tn>
// 返回值类型 函数名(参数列表)
// {}// 有了模板就可以重新写一下Swap这个函数
template<typename T> // 这就是模板,T既是类型,相当于把类型变成了模板,不仅可以用T,也可以是K,V,就是个名字
void Swap(T &left, T &right) // 无论left和right是什么类型的,传入什么类型就是什么类型
{T temp = left;left = right;right = temp;
}

所以他们底层调用的也不是同一个函数。

【注意】:typename是用来定义模板参数关键字,也可以使用class,template<class T>

// 如果参数有两个参数,但是传入的类型不同
T Add(const T& left, const T& right) // 引用常量必须用const修饰
{return left + right;
}int main()
{// 编译器自动推演,隐式实例化// cout << Add(1.0, 2) << endl; 这样是错误的cout << Add((int)1.0, 2) << endl;cout << Add(1.0, (double)2) << endl;// 显示实例化cout << Add<int>(1.0, 2) << endl;cout << Add<double>(1.0, 2) << endl;
}

类模板

类模板的定义格式

template<class T1, class T2, ..., class Tn>
class 类模板名
{// 类内成员定义
};

类模板的实例化

        类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。
// ClassName是类名,ClassName<int>才是类型,这是两个类型
ClassName<int> CNi;
ClassName<double> CNd;

【注意】:模板不支持分离编译,如声明放在.h,定义放在.cpp;但是放在同一个文件就可以。


        

简单介绍一下模板的使用,以保证后面知识的讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/88082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】医院智能导诊小程序源码,springboot框架

智能导诊 可以根据用户症状描述精准推荐科室及医生智能学习医院历史数据及自动进行科室对照,与医院的系统连接后,患者可直接完成预约。 一、系统概述 “智能导诊”以人工智能手段为依托&#xff0c;为人们提供智能分诊、问病信息等服务&#xff0c;在一定程度上满足了人们自我…

低照度增强算法(图像增强+目标检测+代码)

本文介绍 在增强低光图像时&#xff0c;许多深度学习算法基于Retinex理论。然而&#xff0c;Retinex模型并没有考虑到暗部隐藏的损坏或者由光照过程引入的影响。此外&#xff0c;这些方法通常需要繁琐的多阶段训练流程&#xff0c;并依赖于卷积神经网络&#xff0c;在捕捉长距…

python+vue驾校驾驶理论考试模拟系统

管理员的主要功能有&#xff1a; 1.管理员输入账户登陆后台 2.个人中心&#xff1a;管理员修改密码和账户信息 3.用户管理&#xff1a;管理员可以对用户信息进行添加&#xff0c;修改&#xff0c;删除&#xff0c;查询 4.添加选择题&#xff1a;管理员可以添加选择题目&#xf…

ElementUI首页导航和左侧菜单静态页面的实现,以及Mockjs和总线的介绍

目录 前言 一. Mock.js 1.1 什么是Mock.js 1.2 Mockjs的安装与配置 1.2.1 安装Mock.js 1.2.2 引入Mock.js 1.3 Mockjs的使用 1.3.1 定义数据测试文件 1.3.2 mock拦截ajax请求 二. 首页导航以及左侧菜单的搭建 2.1 什么是总线 2.2 创建三个vue组件 首页AppMain.vue组…

QT 6.5下载安装及配置教程

一、下载 今天打算换一个QT安装版本,去官网看了一眼发现变成了在线安装。 本来官方下载的就慢,现在更是雪上加霜,现在给大家推荐几种下载方式。 1、国内镜像 中国科学技术大学&#xff1a;http://mirrors.ustc.edu.cn/qtproject/ 清华大学&#xff1a;https://mirrors.tuna.ts…

Ubuntu部署nginx

一、 下载nginx相关依赖包 apt-get install gccapt-get install libpcre3 libpcre3-devapt-get install zlib1g zlib1g-devsudo apt-get install opensslsudo apt-get install libssl-dev二、新建nginx的安装目录 cd /optmkdir nginxcd nginx三、通过wget下载nginx安装包 wg…

2024快手校招面试真题汇总及其解答(一)

1.spring springmvc springboot区别 Spring、Spring MVC 和 Spring Boot 都是 Java 框架,它们之间存在一定的联系和区别。 Spring 是 Java 的一个开源框架,它提供了一系列的模块,用于简化 Java 应用程序的开发。Spring 的核心模块是 IoC 容器和 AOP 框架,它们可以帮助开发…

SpringBatch ItemProcessor详解

ItemProcessor 在Spring Batch中用于对每个读取的数据项&#xff08;item&#xff09;进行处理或转换。 一、ItemProcessor 具体功能 数据清洗&#xff08;Data Cleansing&#xff09;&#xff1a;清理数据以确保数据的一致性和准确性。这可以包括去除不必要的空格、特殊字符、…

2025快手校招面试真题汇总及其解答(二)

6. hashmap数据结构 HashMap 是一种散列表,它是一种根据键值对来存储数据的数据结构。HashMap 的特点是插入、查找和删除操作的时间复杂度都是 O(1),因此它是一种非常高效的数据结构。 HashMap 的工作原理是将键值对存储在一个数组中,每个键值对都由一个哈希函数来映射到数…

pyspark 检测任务输出目录是否空,避免读取报错

前言 在跑调度任务时候&#xff0c;有时候子任务需要依赖前置任务的输出&#xff0c;但类似读取 Parquet 或者 Orc 文件时&#xff0c;如果不判断目录是否为空&#xff0c;在输出为空时会报错&#xff0c;所以需要 check 一下&#xff0c;此外Hadoop通常在写入数据时会在目录中…

简易好用的C++结构体与JSON文本相互转换开源库

开源库地址&#xff1a; https://github.com/bk192077/struct_mapping.git 支持结构体&#xff0c;std::strng, std::vcetor, std::list, std::map, std::multimap等类型 注意&#xff1a;需要std c17 及以上版本支持 测试程序&#xff1a; #include "struct_mapping…

电压放大器在超声成像中的工作原理和应用

在超声成像中&#xff0c;电压放大器是一种重要的仪器&#xff0c;主要用于放大从探头传来的微弱信号&#xff0c;并将其转换为可以处理和显示的电信号。下面安泰电子将详细介绍电压放大器在超声成像中的工作原理和应用。 图&#xff1a;超声成像 工作原理 在超声成像中&#x…

第二届全国高校计算机技能竞赛——Java赛道

第二届全国高校计算机技能竞赛——Java赛道 小赛跳高 签到题 import java.util.*; public class Main{public static void main(String []args) {Scanner sc new Scanner(System.in);double n sc.nextDouble();for(int i 0; i < 4; i) {n n * 0.9;}System.out.printf(&…

【深度学习实验】前馈神经网络(一):使用PyTorch构建神经网络的基本步骤

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 定义x,w,b 2. 计算净活性值z 3. 实例化线性层并进行前向传播 4. 打印结果 5. 代码整合 一、实验介绍 本实验使用了PyTorch库来构建和操作神经网络模型&#xff0c;主要是关…

18672-2014 枸杞 学习记录

声明 本文是学习GB-T 18672-2014 枸杞. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了枸杞的质量要求、试验方法、检验规则、标志、包装、运输和贮存。 本标准适用于经干燥加工制成的各品种的枸杞成熟果实。 2 规范性引用文件…

时序预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元时间序列预测

时序预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向…

PHP生成带中文的图片

imagettftext() 函数是 PHP 中的一个内置函数&#xff0c;用于使用 TrueType 字体将文本写入图像。 句法&#xff1a; 数组imagettftext&#xff08;资源$image&#xff0c;float $size&#xff0c;float $angle&#xff0c; int $x&#xff0c;int $y&#xff0c;…

【Pycharm/Anaconda配置环境记录】

文章目录 1、Pytorch配置2、mmcv配置 1、Pytorch配置 查看虚拟环境创建虚拟环境 conda env list&#xff1a;查看虚拟环境 conda create --name env_name python3.7&#xff1a;创建虚拟环境 conda activate env_name&#xff1a;激活/进入该虚拟环境 查看自己的CUDA版本以及P…

田忌赛马Java

给定两个大小相等的数组 A 和 B&#xff0c;A 相对于 B 的优势可以用满足 Ai] > Bi] 的索的数目来描述。 返回 A的任意排列&#xff0c;使其相对于 B 的优势最大化. 其实核心思想就是让A中的数最小且刚好大于B中数,我们可以用链表来存储A和B中对应的数据,至于B比A中所有的数…

DragGesture/拖动手势 的使用

1. DragGesture 拖动手势操作 1.1 实现 /// 拖动手势 struct DragGestureBootcamp: View {State var offset: CGSize .zerovar body: some View {//dragGesture1dragGesture2}/// 方式二var dragGesture2: some View{ZStack {VStack {Text("\(offset.width)")Space…