【C++】c++中的函数模板

news2025/1/31 8:16:25

在这里插入图片描述

文章目录

  • 前言
  • 什么是函数模板
  • 为什么要有模板
  • 怎么用函数模板


前言

c语言中没有提供模板,要求实现一个Add函数,对于不同的数据类型可能存在Add_int(),Add_double()等函数,这种重复操作比较的低效,c++提供了函数重载的功能,尽管函数体内容相同,但依旧要对函数体去进行多次实现,以面对不同的数据类型,如果需要重载的函数非常复杂,这将会造成比较大的浪费,
c++提供了模板来解决这个问题


什么是函数模板

概念:函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器,函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

格式

函数模板格式
template<typename T1, typename T2,......,typename Tn>
返回值类型 函数名(参数列表){}

template<typename T>
T Add( T& x, T& y)
{
	return x+y;
}


实例化:在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此

在这里插入图片描述
模板参数实例化分为:隐式实例化显式实例化

  1. 隐式实例化:让编译器根据实参推演模板参数的实际类型
template<class T>
T Add(const T& left, const T& right)
{
return left + right;
}
int main()
{
int a1 = 10, a2 = 20;
double d1 = 10.0, d2 = 20.0;
Add(a1, a2);
Add(d1, d2);
/*
该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型
通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T,
编译器无法确定此处到底该将T确定为int 或者 double类型而报错
注意:在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题,编译器就需要背黑锅
Add(a1, d1);
*/
// 此时有两种处理方式:1. 用户自己来强制转化 2. 使用显式实例化
Add(a, (int)d);
return 0}

2.显式实例化:在函数名后的<>中指定模板参数的实际类型

int main(void)
{
int a = 10;
double b = 20.0;
// 显式实例化
Add<int>(a, b);
return 0;
}

为什么要有模板

1.通用性:函数模板允许编写通用的函数代码,可以在不同的数据类型上进行操作,而无需为每种数据类型编写特定的函数。这使得代码更具通用性和灵活性,可以适用于各种数据类型,提高了代码的重用性。

2.类型安全性:函数模板可以提供编译时类型检查,确保在使用模板时传递的参数类型是正确的。这有助于避免在运行时出现类型不匹配的错误,提高了程序的稳健性和安全性。

3.代码简洁性:函数模板可以减少重复的代码量,使代码更加简洁清晰。通过模板的参数化,可以将一些通用的代码逻辑抽象成模板函数,从而简化代码的编写和维护。

4.标准库支持:C++标准库中大量使用了函数模板,例如STL(标准模板库)中的容器和算法等。用户不用自己造轮子了。

怎么用函数模板

1.使用官方提供的函数模板如,string,vector,list等,
在代码中声明包含头文件即可,如何使用可以去c++官网查看https://cplusplus.com/
在这里插入图片描述
2.自己定义的函数模板
1.声明模板

//T可以是任意字符,相当于设定了未知数T
template<class T>

2.定义函数体,不用特定声明的数据类型用T代替

T Add(T x,T y)
{
	return x+y;
}
返回值、x和y的数据类型都用了T

3.使用,分为显式调用和隐式调用,什么是函数模板中有提到

调用的匹配规则

  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版本
}

2.2. 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板

// 专门处理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函}

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

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

相关文章

【感知机】感知机(perceptron)学习算法的对偶形式

感知机( perceptron )是二类分类的线性分类模型&#xff0c;其输入为实例的特征向量&#xff0c;输出为实例的类别&#xff0c;取1 和-1二值。感知机对应输入空间(特征空间)中将实例划分为正负两类的分离超平面&#xff0c;是一种判别模型。感知机是神经网络与支持向量机的基础…

第十二章[模块]:12.5:标准库:zipfile

一,认识zipfile: 1,什么是zipfile? zipfile是python里用来做zip格式编码的压缩和解压缩的, 它采用平时应用非常常见的zip格式, 所以这个模块使用频率也很高 2,官方文档: zipfile --- 使用ZIP存档 — Python 3.12.2 文档源代码: Lib/zipfile/ ZIP 文件格式是一个常用的归…

一款服务于医院临床数据资源建设的平台,助力医疗信息化发展

随着医疗技术的不断发展&#xff0c;医院需要越来越多的临床数据来支持科研、教学和临床实践。然而&#xff0c;在传统的医疗系统中&#xff0c;数据分散、信息割裂、无法有效整合和共享。为了解决这一问题&#xff0c;临床数据资源整合平台应运而生。 临床数据资源整合平台是…

19-k8s的附加组件-coreDNS组件

一、概念 coreDNS组件&#xff1a;就是将svc资源的名称解析成ClusterIP&#xff1b; kubeadm部署的k8s集群自带coreDNS组件&#xff0c;二进制部署需要自己手动部署&#xff1b; [rootk8s231 ~]# kubectl get pods -o wide -A k8s系统中安装了coreDNS组件后&#xff0c;会有一个…

“挖矿”系列:细说Python、conda 和 pip 之间的关系

继续挖矿&#xff0c;挖“金矿”&#xff01; 1. Python、conda 和 pip&#xff08;挖“金矿”工具&#xff09; Python、conda 和 pip 是在现代数据科学和软件开发中常用的工具&#xff0c;它们各自有不同的作用&#xff0c;但相互之间存在密切的关系&#xff1a; Python&…

半理想架构的Doherty功率放大器理论与仿真-基于GAN器件CGH40010F

半理想架构的Doherty功率放大器理论与仿真-基于GAN器件CGH40010F 理想架构的Doherty功率放大器理论与仿真中已经介绍了如何在ADS中使用理想电流源来对DPA的架构进行仿真。但是理想的电流源太理想了&#xff0c;电压、电流的许多行为都是需要自己使用数学公式去严格定义&#x…

RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?<= , (?= , (?<! , (?!

RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?< , (? , (?<! , (?! 有好多种称呼 (?< , (? , (?<! , (?! 有好多种称呼 , 我称为: 左限定, 右限定, 左否定, 右否定 (?<左限定)    (?右限定)(?<!左否定)    (?!右限定) 再…

直播预告贴纸功能与直播商品预告功能设置基础

一.短视频预告贴纸功能 1.功能介绍 2.使用说明 设置预告贴纸入口 &#xff08;1&#xff09;拍摄视频时添加贴纸 &#xff08;2&#xff09;关播页去发布下一条短视频预告 &#xff08;3&#xff09;主播个人主页–直播动态 3.开播时间设置 4.开播提醒 5.用户端功能展示…

Chrome 关闭F12 网络选项下的大时间段图

把所有的按钮点了一遍&#xff0c;终于找到了 点开F12点右上的小齿轮&#xff0c;把概览取消勾选就可以了 英文的控制台中叫Overview

python-产品篇-游戏-成语填填乐

文章目录 准备代码效果 准备 无需其他文件&#xff0c;复制即用 代码 import random list["春暖花开","十字路口","千军万马","白手起家","张灯结彩","风和日丽","万里长城","人来人往",&…

RocketMQ(三):消息类型(普通、定时、顺序和事务消息)——备份

1 普通消息 普通消息为Apache RocketMQ最基础的消息&#xff0c;区别于有特性的顺序消息、定时/延时消息和事务消息。本节介绍普通消息的应用场景、功能原理、使用方法和使用建议。 1.1 应用场景 普通消息一般应用于微服务解耦、事件驱动、数据集成等场景&#xff0c;这些场景…

外汇110:外汇做空是什么意思?如何运作?一文读懂

外汇市场允许卖空&#xff0c;就像众多金融市场一样。但什么是卖空呢&#xff1f;如何外汇做空&#xff1f;在本文中&#xff0c;我们将讨论如何做空货币。什么是外汇做空&#xff1f; 外汇做空&#xff08;Short Selling&#xff09;是外汇市场上的一种投资方式。它指的是投资…

制作一个入耳式耳机壳需要用到哪些材料和工艺流程呢?

制作一个入耳式耳机壳需要用到以下材料和工艺流程&#xff1a; 材料&#xff1a; 耳机壳材料&#xff1a;常用的有PC/ABS塑料、金属、陶瓷、木质等。不同材料具有不同的特性&#xff0c;如塑料轻便耐用、金属质感好、陶瓷高档、木质自然等。耳塞材料&#xff1a;常用的有硅胶、…

Jlink+OpenOCD+STM32 Vscode 下载和调试环境搭建

对于 Mingw 的安装比较困难&#xff0c;国内的网无法正常在线下载组件&#xff0c; 需要手动下载 x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z 版本的软件包&#xff0c;添加环境变量&#xff0c;并将 mingw32-make.exe 名字改成 make.exe。 对于 OpenOCD&#xff0c;需要…

GPT4微信机器人部署,集成gpt4问答、midjourney以及新闻等联网功能,免费可添加机器人成为自己专属助理

GPT问答和midjourney作为AI届两大亮点&#xff0c;都各自有官方体验方式。 同时&#xff0c;也有很多大神搭建了各类软件、平台供用户体验使用。 但是如果同时将GPT问答和midjourney集合到日常最常使用的微信呢&#xff1f; 打造一个微信机器人&#xff0c;不仅自己可以随时…

【Linux】进程的初步认识(一)

进程的初步认识 基本概念描述进程task_struct-PCB的一种task_stuct内容分类 查看进程通过系统调用获取进程标识符 基本概念 要了解进程&#xff0c;首先我们要知道两点 我们可以同时启动多个程序&#xff0c;也就意味着我们可以将多个.exe文件加载到内存操作系统如何去管理这些…

kettle--JavaScript脚本日期使用

输入日期为20240216&#xff0c;运行如下代码&#xff0c;结果为true var reportdate parent_job.getVariable("v_reportdate"); var date_type parent_job.getVariable("v_date_type"); var reportdate_freportdate.substr(0,4) "/" report…

如何在亚马逊,美客多,阿里国际,速卖通上安全地进行自养号测评?

借鉴亚马逊等跨境电商市场的经验&#xff0c;我们建议选取具备以下特点的产品在平台上销售&#xff0c;以实现需求稳定、竞争较低、利润较高&#xff0c;同时规避法律纠纷和质检问题。首先&#xff0c;应选择体积小、重量轻、易于运输的商品&#xff0c;这有助于降低运输成本和…

Ant Design Card 组件展示图片

文章目录 Ant Design Card 组件展示图片理解card组件结构隐藏卡片内容区域 下拉时加载图片卡片加载更多代码 分页的方式加载图片列表【推荐】实现思路代码demo缩略图在card组件下发显示图片文件名卡片操作 分页 Ant Design Card 组件展示图片 官方文档&#xff1a; Card卡片组…

Leetcode-429.N叉树的层序遍历

题目&#xff1a; 给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。 树的序列化输入是用层序遍历&#xff0c;每组子节点都由 null 值分隔&#xff08;参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff…