C++ || 模板初阶 | 函数模板 | 类模板

news2024/11/17 23:36:01

泛型编程

泛型编程,编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

  • 可以理解为活字印刷术类似的方式。

函数模板

函数模板概念

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

解决函数作用相同,但是参数类型不同,得写好几个参数不同但函数功能相同的代码,函数模板就是解决这个问题。

本来应该我们做的重复的事情交给了编译器。

函数模板语法

template<typename T1,typename T2,...,typename Tn>
返回类型 函数名(参数列表){}
  • typename是定义模板参数关键字
  • 可以使用class,但不能是struct

函数模板使用案例

#include <stdio.h>
#include <iostream>
using namespace std;
//template<typename T>
template<class T>
//typename是定义模板参数的关键字,
//也可以使用class,但不能是struct
void Swap(T& left, T& right)
{
	T temp = left;
	left = right;
	right = temp;
}
int main()
{
	int a = 3, b = 5;
	Swap(a, b);
	cout << "a=" << a << " " << "b=" << b << endl;//a=5 b=3
	double d = 2.63, e = 9.35;
	Swap(d, e);
	cout << "d=" << d << " " << "e=" << e << endl;//d=9.35 e=2.63
	return 0;
}

函数模板原理

  • 函数模板,本身并不是函数;
  • 编译器产生特定具体类型函数的模具;
  • 在编译器编译阶段,编译器根据传入的实参类型推演生成对应类型的函数
  • 例如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码。

函数模板实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显示实例化

隐式实例化

隐式实例化,让编译器自己根据实参推演模板参数的实际类型。

template <typename T>
T Add(const T& left, const T& right)
{
	return left + right;
}
int main()
{
	int a1 = 10, a2 = 20;
	double d1 = 10.9, d2 = 45.8;
           //隐式实例化
	cout << Add(a1, a2) << endl; //30
	cout << Add(d1, d2) << endl;//56.7

	// Add(a1, d1) 会报错 
	// 编译器无法确定此处到底该是将T确定为int还是double
	// 两种处理方式:①用户强转 Add(a1, (int)d1) ;②显示实例化 Add<int>(a1, d1) 
	//cout << Add(a1, d1) << endl;//56.7
	cout << Add(a1, (int)d1) << endl;//56.7
	return 0;
}

显示实例化

显示实例化,在函数名后的<>中指定模板参数的实际类型

template <typename T>
T Add(const T& left, const T& right)
{
	return left + right;
}
int main()
{
	int a = 10;
	double d = 10.9;
	        //显示实例化
	cout << Add<int>(a, d) << endl;//20
	return 0;
}

模板参数的匹配规则

  • 一个非模板函数可以和一个同名模板函数同时存在。

非模板函数与同名模板函数同时存在时:

  • 调用函数与非模板函数匹配时,编译器不需要推演特化;
  • 有显示实例化,编译器进行函数模板推演;
  • 优先调用非模板函数;
  • 模板函数不允许自动类型转换,但普通函数可以进行自动类型转化。

类模板

将类中的成员变量或者成员函数的参数数据类型进行模板化。

类模板名字不是真正的类,实例化的结果才是真正的类。

类模板语法

  • 类模板中函数放在类外进行定义时,需要加模板参数列表。
template<class T1,class T2,...,class Tn>
class 类模板名
{
	//类成员
};

//类模板函数在类外定义,加模板参数列表
template<class T1,class T2,...,class Tn>
类模板名<T1/T2/.../Tn>::类模板成员函数名()
{
    函数功能
}

int main()
{
    类模板名<实例化类型> 类对象实例化名字;//Date d;
}

类模板实例化

类模板名<实例化的类型> 实例化类对象名;
//Date d1;

类模板名字不是真正的类,实例化的结果才是真正的类。

类模板使用案例

template<class T>
class Vector
{
private:
	T* _pData;
	size_t _size;
	size_t _capacity;

public:
	Vector(size_t capacity = 10)
		:_pData(new T[capacity])
		,_size(0)
		,_capacity(capacity)
	{

	}

	~Vector();
};

template <class T>
Vector<T>::~Vector()
{
	if (_pData)
		delete[] _pData;
	_size = 0;
	_capacity = 0;
}

int main()
{
	Vector<int> S1;
	//Vector类名 int参数类型
}

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

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

相关文章

【SpringBoot】application配置(5)

type-aliases-package: com.rabbiter.cm.domaintype-aliases-package: 这个配置用于指定mybatis的别名&#xff0c;别名是一个简化的方式&#xff0c;让你在Mapper xml 文件中引用java类型&#xff0c;而不需要使用使用完整的类名。例如&#xff0c;如果你在 com.rabbiter.cm.d…

《数字孪生城市建设指引报告(2023年)》指引智慧城市行动方向

2023年12月27日&#xff0c;中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;产业与规划研究所、中国互联网协会数字孪生技术应用工作委员会和苏州工业园区数字孪生创新坊联合发布《数字孪生城市建设指引报告&#xff08;2023年&#xff09;》。该报告提出了三大…

jsp康养小镇管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP康养小镇管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&a…

【大模型上下文长度扩展】YaRN:以文匹意,精细化衔接长篇

YaRN 核心问题上下文窗口限制位置编码的限制YaRN的原理 YaRN方法 NTK-aware NTK-by-parts Dynamic NTK子问题1: 高频信息丢失子解决1: “NTK-aware”插值子问题2: 相对局部距离的丢失子解决2: “NTK-by-parts”插值子问题3: 动态缩放子解决3: “Dynamic NTK”插值分析不足 核…

JVM双亲委派机制

双亲委派模型是一种组织类加载器之间关系的一种规范,他的工作原理是:如果一个类加载器收到了类加载的请求,它不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,这样层层递进,最终所有的加载请求都被传到最顶层的启动类加载器中,只有当父类加载器无法完成这个加载…

STM32TIM定时器(4)

文章目录 前言一、介绍部分编码器简介正交编码器编码器接口基本结构工作模式均不反向实例均反向实例 二、代码部分编码器接口测速连接线路 代码实现 前言 这部分主要介绍定时器编码器接口&#xff0c;了解使用编码器对计数器的控制&#xff0c;理解正交编码器的工作模式&#…

【JavaScript 漫游】【010】属性描述对象

本文为【JavaScript 漫游】专栏的第 010 篇文章&#xff0c;记录了属性描述对象的重要知识点。 什么是属性描述对象Object.getOwnPropertyDescriptorObject.getOwnPropertyNamesObject.defineProperty、Object.definePropertiesObject.prototype.propertyIsEnumerable元属性存…

win7如何录屏?高性价比工具,轻松录制精彩内容

在数字时代的今天&#xff0c;Windows 7仍然在很多企业和个人用户中占据着重要的地位。尽管微软已经推出了更新的操作系统&#xff0c;但win7因其稳定性和兼容性仍被广泛使用。然而&#xff0c;随着技术的进步&#xff0c;许多用户发现他们需要一种简单而有效的方式来录制电脑屏…

Linux安全技术与iptables防火墙

一.安全技术&#xff1a; 入侵检测系统&#xff08;Intrusion Detection Systems&#xff09;&#xff1a;特点是不阻断任何网络访问&#xff0c;量化、定位来自内外网络的威胁情况&#xff0c;主要以提供报警和事后监督为主&#xff0c;提供有针对性的指导措施和安全决策依据,…

【开源】JAVA+Vue.js实现开放实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

redis源码之:cluster集群故障处理

在redis源码之&#xff1a;集群创建与节点通信&#xff08;1&#xff09;分析clusterCron定时任务及在redis源码之&#xff1a;集群创建与节点通信&#xff08;2&#xff09;分析**clusterReadHandler处理ping请求与pong响应时&#xff08;clusterProcessPacket&#xff09;**时…

idea设置terminal为git

要在IntelliJ IDEA中设置终端为Git Bash&#xff0c;请按照以下步骤操作&#xff1a; 打开 Settings&#xff08;设置&#xff09;。点击 Tools&#xff08;工具&#xff09;选项卡。进入 Terminal&#xff08;终端&#xff09;界面。在 Shell Path 下选择 Browse&#xff08;…

MCU+SFU视频会议一体化,视频监控,指挥调度(AR远程协助)媒体中心解决方案。

视频互动应用已经是政务和协同办公必备系统&#xff0c;早期的分模块&#xff0c;分散的视频应该不能满足业务需要&#xff0c;需要把视频监控&#xff0c;会议&#xff0c;录存一体把视频资源整合起来&#xff0c;根据客户需求&#xff0c;需要能够多方视频互动&#xff0c;直…

机器学习-线性回归法

线性回归算法 解决回归问题思想简单&#xff0c;实现容易许多强大的非线性模型的基础结果具有很好的可解释性蕴含机器学习中的很多重要思想 样本特征只有一个&#xff0c;称为&#xff1a;简单线性回归 通过分析问题&#xff0c;确定问题的损失函数或者效用函数 通过最优化…

相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

【漏洞复现】电信网关配置管理系统SQL注入漏洞

Nx01 产品简介 电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远程监控、配置、升级和故障排除等功能&#xff0c;从而确保网络的正常运行和高效性能。 Nx02 漏洞描述 电信网关配置管理系统存在SQL注入漏洞,攻…

Android CMakeLists.txt语法详解

一.CMake简介 你或许听过好几种 Make 工具&#xff0c;例如 GNU Make &#xff0c;QT 的 qmake &#xff0c;微软的 MSnmake&#xff0c;BSD Make&#xff08;pmake&#xff09;&#xff0c;Makepp&#xff0c;等等。这些 Make 工具遵循着不同的规范和标准&#xff0c;所执行的…

CV | Medical-SAM-Adapter论文详解及项目实现

******************************* &#x1f469;‍⚕️ 医学影像相关直达&#x1f468;‍⚕️******************************* CV | SAM在医学影像上的模型调研【20240207更新版】-CSDN博客 CV | Segment Anything论文详解及代码实现 本文主要讲解Medical-SAM-Adapter论文及项…

兼容ARM 32位架构的edgeConnector产品为用户提供新的部署选项

Softing工业将ARM 32位兼容性集成到了edgeConnector产品中&#xff0c;以满足用户对ARM处理器的边缘设备日益增长的使用需求。 &#xff08;兼容ARM 32位架构的edgeConnector产品扩展了其应用部署范围&#xff09; 用户对采用ARM处理器的紧凑型边缘设备的需求正在大幅增长&…

LC 2641. 二叉树的堂兄弟节点 II

2641. 二叉树的堂兄弟节点 II 难度 : 中等 题目: 给你一棵二叉树的根 root &#xff0c;请你将每个节点的值替换成该节点的所有 堂兄弟节点值的和 。 如果两个节点在树中有相同的深度且它们的父节点不同&#xff0c;那么它们互为 堂兄弟 。 请你返回修改值之后&#xff0c;…