一文搞懂模板(template)

news2025/2/21 11:44:57

背景引入:
想象一下,我们要实现一个整数相加,浮点数相加的函数,如果按C语言的思路,我们需要写两个函数名不同的函数,来完成相加;如果C++语言,则可以通过函数重载的特性,写两个函数名相同,但参数列表不同的函数,来完成任务。
不管怎么样,我们都需要实现两个函数?

那么我们可以只写一个通用的函数,来完成这个任务吗?
接下来就要请模板出场!

template

  • 1. 模板概念
  • 2. 使用方法
  • 3. 模板原理
  • 4. 模板实例化
    • 4.1 隐式实例化
    • 4.2 显式实例化
  • 5. 模板参数匹配规则
  • 6. 类模板
    • 6.1 定义格式

1. 模板概念

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

2. 使用方法

使用如下方法定义函数模板,并且可以根据需要定义多个模板参数。
template<class A, class B…>

template<class T>    //template<typename T>   也可以
T Add(T x, T y)
{
	return x + y;
}

3. 模板原理

在编译器编译阶段,对于函数模板的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。
例如:当使用double类型使用函数模板时,编译器通过对实参推演,会自动生成一份double类型的函数,以供调用。
在这里插入图片描述


template<class T>    //template<typename T>   也可以
T Add(T x, T y)
{
	return x + y;
}


int main()
{

	int a = 10;
	int b = 11;

	double c = 1.1;
	double d = 2.2;

	Add(a, b);
	Add(c, d);
	return 0;
}

在这里插入图片描述

从上面的例子可以看出,编译器确实自动生成了两个参数不同的函数(因为调用地址不同)。

4. 模板实例化

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

4.1 隐式实例化

让编译器根据实参类型,自己推演。

template<class T>    //template<typename T>   也可以
T Add(T x, T y)
{
	return x + y;
}


int main()
{

	int a = 10;
	int b = 11;

	double c = 1.1;
	double d = 2.2;

	Add(a, b);  // 生成整形模板
	Add(c, d);   //生成double模板
	Add(a, d);   // 编译报错,因为a是int,b是double,只有一个模板T,编译器不知道生成哪个。
	// 解决方法:
	//1.用户自己来强制转化
	Add(a, (int)d);
	//2. 使用显示实例化
	return 0;
}

4.2 显式实例化

在函数名后的<>中指定模板参数的实际类型。

int a = 10;
double b =1.1;
Add<int>(a, b);   //显示实例化
// 如果类型不配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器会自动报错。

5. 模板参数匹配规则

  1. 一个非模板参数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。
// 专门处理int的加法函数
int Add(int left, int right)
{
 return left + right;
}
// 通用加法函数
template<class T>
T Add(T left, T right)
{
 return left + right;
}
void Test()
{
 Add(1, 2); // 与非模板函数匹配,编译器不需要特化
 Add<int>(1, 2); // 调用编译器特化的Add版本
}
  1. 对于非模板函数和同名函数模板,如果其他条件都相同,在调用时优先调用非模板函数而不会从模板特化一个实例;如果模板可以产生一个更合适的函数,那么选择模板。
// 专门处理int的加法函数
int Add(int left, int right)
{
 return left + right;
}


// 通用加法函数
template<class T1, class T2>
T1 Add(T1 left, T2 right)
{
 return left + right;
}
void Test()
{
 Add(1, 2); // 与非函数模板类型完全匹配,不需要函数模板实例化
 Add(1, 2.0); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add函}
  1. 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。

6. 类模板

6.1 定义格式

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

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

实例化一个类型为A的a对象,类型要求为int。

A<int> a;
// A 类名,A<int> 才是类型

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

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

相关文章

LC1305. 两棵二叉搜索树中的所有元素(JAVA)

两棵二叉搜索树中的所有元素 题目描述中序遍历 归并排序 题目描述 难度 - 中等 LC1305. 两棵二叉搜索树中的所有元素 给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表&#xff0c;其中包含 两棵树 中的所有整数并按 升序 排序。. 示例1&#xff1a; 输入&#xff1a;…

燃气安全如何保障?万宾燃气管网监测系统时刻感知管网运行态势

近年来随着我国城镇化建设的加快&#xff0c;燃气已经成为每个家庭的必需品。然而&#xff0c;每年夏季频繁发生的燃气爆炸事故&#xff0c;已经严重危害人民生命财产安全危害社会公共安全和公共利益。为了保障燃气安全运行&#xff0c;近日&#xff0c;许多城市都在大力推进燃…

Redis代码实践总结(二)

使用 CLI 探索 Redis 外部程序使用 TCP 套接字和 Redis 特定协议与 Redis 进行通信。该协议在不同编程语言的 Redis 客户端库中实现。然而&#xff0c;为了使使用 Redis 进行黑客攻击变得更简单&#xff0c;Redis 提供了一个命令行实用程序&#xff0c;可用于向 Redis 发送命令…

Docker配置镜像加速器

1.登录阿里云 阿里云-计算&#xff0c;为了无法计算的价值 (aliyun.com) 2.容器 说明&#xff1a;找到产品下的容器 3.容器镜像服务ACR 4.点击控制台 5. 点击镜像加速器 6.操作文档

项目开发过程中,成员提离职,怎么办?

之前写过一篇《如何应对核心员工提离职》反响特别好&#xff0c;今天做个延展篇&#xff0c;在项目过程中&#xff0c;员工突然提离职&#xff0c;我们有什么办法让项目按时按质的上线。 项目做多了&#xff0c;总会碰到这种情况。这里给大家介绍一个解决项目问题的分析方法&a…

【0223】源码剖析smgr底层设计机制(3)

1. smgr设计机制 PG内核中smgr完整磁盘存储介质的管理是通过下面三部分实现的。 1.1 函数指针结构体 f_smgr 函数指针结构体 f_smgr。 通过该函数指针类型,可完成类似于UNIX系统中的VFD功能,上层只需要调用open()、read()、write()等系统函数,用户不必去关系底层的文件系统…

Git那些事系列:从业务场景到高级技巧的完整指南(三)

文件修改的记录居然没有了&#xff01;&#xff01;&#xff01; 如何隐蔽的把一次修改记录搞丢&#xff01; 大家好&#xff0c;有到了Git那些事系列了&#xff0c;近期笔者遇到了一个十分奇怪的事情&#xff0c;一个Git仓库的文件被莫名其妙的修改了&#xff0c;问题是&…

1、SpringBoot_快速入门

一、SpringBoot 概述 文档下载地址&#xff1a;https://docs.spring.io/spring-boot/docs/current/reference/ 1.SpringBoot介绍 概述&#xff1a;SpringBoot 开发团队认为Spring操作太繁琐了&#xff0c;目的在于简化开发配置&#xff0c;能够快速搭建开发环境&#xff0c;…

25422-2010 草地潜松犁 阅读笔记

声明 本文是学习GB-T 25422-2010 草地潜松犁. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了草地潜松犁(以下简称潜松犁)的技术要求、试验方法、检验规则、标志、包装与贮存。 本标准适用于在草地上进行不翻垡松土、切根等项作…

RK3588 VDD_CPU_BIG0/1 电源PCB设计注意事项

RK3588 VDD_CPU_BIG0/1 电源PCB设计 1、如图1所示的滤波电容&#xff0c;原理图上靠近 RK3588的VDD_CPU_BIG电源管脚绿线以内的去耦电容务必放在对应的电源管脚背面&#xff0c;电容GND PAD尽量靠近芯片中心的GND管脚放置&#xff0c;如图2所示。其余的去耦电容尽量摆放在3588…

python学习--特殊方法和属性

名称描述特殊属性dict获得类对象或实例对象所绑定的所有属性和方法的字典特殊方法len()通过重写_len_()方法&#xff0c;让内置函数len()的参数可以是自定义的类型特殊方法add()通过重写_add_()方式&#xff0c;&#xff0c;可使自定义对象有‘’的功能特殊方法new()用于创建对…

overleaf杂谈-Springer文献格式问题

目录 overleaf写作问题记录1.Latex中的%问题&#xff08;文本变成灰色&#xff09;2.Springer文献格式问题2.1 新建reference.bib2.2 谷歌学术搜索文章并引用2.3 复制BibTex2.4 复制进reference.bib2.5 在sn-article.tex的\end{document}前添加语句2.6 引用文献2.7 Springer模板…

视频下载器助手:如何把微信视频号的视频下载下来

随着移动互联网的飞速发展&#xff0c;短视频已深入人心&#xff0c;成为我们生活中不可或缺的一部分。我们常常在各种社交平台上发现有趣、有价值的视频内容&#xff0c;但不知道如何把微信视频号的视频下载下来并保存到本地手机相册 今天&#xff0c;我为大家带来了一款实用…

C语言每日一题(11):杨辉三角

文章主题&#xff1a;求两个数二进制中不同位的个数&#x1f525;所属专栏&#xff1a;C语言每日一题&#x1f4d7;作者简介&#xff1a;每天不定时更新C语言的小白一枚&#xff0c;记录分享自己每天的所思所想&#x1f604;&#x1f3b6;个人主页&#xff1a;[₽]的个人主页&a…

SAP ABAP端实现解析具有深层结构的文件内容(类似SAP PO中的FCC功能)

前言 日本项目经常需要通过PI或者CPI去解析一些文件内容&#xff0c;如果只是扁平结构的&#xff0c;不涉及头行结构的话&#xff0c;在PI中可以FCC&#xff08;File Content Conversion&#xff09;进行解析转换&#xff0c;在CPI中可以使用groovy脚本进行解析转换&#xff0…

如何试用 Vectorizer.AI 将位图转换为矢量图

Vectorizer.AI 是一个使用人工智能技术将位图转换为矢量图的在线工具。它支持 JPEG、PNG、BMP 和 GIF 格式的位图&#xff0c;最大像素为 2 万像素&#xff0c;最大文件大小为 30 MB。Vectorizer.AI 目前处于测试阶段&#xff0c;完全免费使用。 要试用 Vectorizer.AI&#xf…

【微服务】spring 控制bean加载顺序使用详解

目录 一、前言 二、使用order注解控制顺序 2.1 order 注解使用示例 2.2 order注解顺序失效问题 2.2.1 order失效问题解决办法 2.3 实现Ordered接口 三、使用dependon注解控制顺序 四、AutoConfiguration注解控制bean加载顺序 4.1 AutoConfigureBefore 操作演示 4.2 A…

进程与线程的记忆方法

有很多人经常会分不清进程与线程的关系&#xff0c; 嗯。。。。。。可能只有我自己记不清吧 举个例子&#xff1a; 进程&#xff1a;登录一个qq号&#xff0c;就是一个进程。 线程&#xff1a;同时打开多个窗口聊天&#xff0c;就是多个线程。 每次记忆完&#xff0c;过了一段…

Python函数绘图与高等代数互融实例(六): 条形图|直方图|饼状图|并列柱状图

Python函数绘图与高等代数互融实例(一):正弦函数与余弦函数 Python函数绘图与高等代数互融实例(二):闪点函数 Python函数绘图与高等代数互融实例(三):设置X|Y轴|网格线 Python函数绘图与高等代数互融实例(四):设置X|Y轴参考线|参考区域 Python函数绘图与高等代数互融实例(五…

SQLAlchemy中filter函数的使用

目录 filter过滤数据 方法及使用示例 基本过滤 多个条件的过滤 模糊查询 IN查询 空值和非空值 代码演示 代码刨析 filter过滤数据 在SQLAlchemy中&#xff0c;filter 方法用于在查询中对数据进行过滤&#xff0c;以获取符合特定条件的记录。这方法允许你构建 SQL 查询中…