C++ 函数模板

C++中的函数模板 之前我们知道的交换两个变量的方法有宏定义、函数,这两种方式都能实现两个变量的交换,但是各有各的优缺点 宏定义: - 优点:代码复用,适合所有的类型 - 缺点:缺少类型检查,宏在预处理阶段就被替换掉,编译器并不知道宏的存在 函数: - 优点:真正的函数调用,编译器对类型进行检查 - 缺点:类型不同需要重复定义函数,代码无法复用 上边两种方式... 阅读详情

模板是C++泛型编程的基础。一个模板就是一个创建类或者函数的蓝图或者公式。通过提供有效的信息,我们将模板转换为特点的类或者函数,这个转换发生在编译过程。


定义模板

假设我们需要一个函数来比较两个值的大小,并指出哪个值大。假如说我们需要比较两个整数谁比较大。那么有以下代码

int compare(const int &a,const int &b)
{
	if(a>b) return 1;
	if(b>a) return -1;
	return 0;
}

那么如果是我想比较两个string的大小呢?那会有如下代码

int compare(const string &a,const string &b)
{
	if(a>b) return 1;
	if(b>a) return -1;
	return 0;
}

这时候大家会发现一个问题,这两个函数几乎相同,唯一的不同是参数的差异,函数体完全一样。如果需要比较的类型少还好,如果所有类型都要比较的话,难道所有的都要写一遍?这不就是傻小子睡凉炕,全凭火力旺!
有没有改进措施?当然是有的,我们发现唯一不同的是参数,那么其实可以通过函数模板这种高效方法解决此问题。


函数模板

我们可以定义一个通用的函数模板,来供功能一样,参数不同的任务去使用。
一个函数模板就相当于一个公式,可以用来生成对应特定类型的函数版本
上面的任务可以写成下面的模板。

template <typename T>
int compare(const T &v1,const T &v2)
{
	if(v1>v2) return 1;
	if(v2>v1) return -1;
	return 0;
}

我们的compare函数声明了一个名为T的类型参数,在compare函数中,我们用T表示一个类型,而T表示的实际类型在编译时根据compare的使用情况来确定。

同时我们可以通过上面的例子,总结出函数模板的定义方式:

  • 模板定义以关键字template开始,后面跟一个模板参数列表
  • 在参数列表内部用逗号分隔开一个或多个列表。在模板定义中,模板参数列表不能为空
  • 在模板参数列表中,每一个类型参数前必须使用关键字class 或者 typename。这两个关键字的含义相同,可以互换使用,可以同时出现

其实我们可以发现,函数模板很像函数。我们通过实参来初始化函数中的形参,在这里我们用模板实参,“初始化”函数模板。


实例化函数模板

当我们调用一个函数模板时,编译器会用函数实参来为我们推断模板实参。也就是说,我们调用上面的compare函数时,编译器会根据我们给定的实参类型,来确定绑定到函数模板参数T的类型。

比方说在下面的例子中,实参类型是int,所以编译器也会推断出模板实参为int,并将它绑定到模板参数T上

cout<<compare(1,0)<<endl;

编译器推断出的模板参数会为我们实例化一个特定版本的函数。那么扩展一下,我们其实可以根据上面的模板,写出下面的代码

//vector<int> vec1{1,2,3}  vector<int> vec2{2,3,4}
cout<<compare(vec1,vec2)<<endl;

在这个例子中,我们实例化了一个,实参为vector的比较函数
这里我们的函数模板实例化方式是隐式实例化,对应的还有显式实例化


模板类型参数

我们可以利用函数模板中的类型参数,去指定返回类型,或者函数的参数类型,或者函数体内的变量声明或者类型转换。这里的类型参数可以看做类型说明符,就像内置类型或者类类型说明符一样使用。

template <typename T> T foo(T* p)
{
	T tmp = *p;//tmp的类型是指针p指向的类型
	...
	return tmp;
}

函数模板的重载

在c++中,重载不仅可以用在函数上,也可以用在函数模板上。下面的例子虽然只是给出了声明没有给实现,但是也可以发现,函数模板的重载与函数的重载一样,也是通过实参的数量,返回值类型等进行实现。

template<class T> void Swap(T &a, T &b);  //模板①:交换基本类型的值
template<typename T> void Swap(T a[], T b[], int len);  //模板②:交换两个数组
stm32h743 FM25CL64铁电存储器踩坑记录 调试FRAM经验总结: 1、跑完FRAM读写代码之后,逻分仪发现总线上只有简单、短暂的电平变化,明显不是SPI的通信数据。 (经提醒发现连片选拉高拉低都没有执行到位) 后来发现是因为片选引脚没有初始化,所以直接拉高拉低是无效的。 2、引脚成功初始化后发现CLK、MISO、MOSI数据仍不正常。通过加打印的方式发现跑到HAL_SPI_Transmit中之后还没有执行到写SPI数据寄存器的那一步就return了。 后来经提醒发现: 上图中的指针使用方式错误 后来又发现: 打印出来发现 阅读详情

相关推荐

【2026-Spark实验一-Windows中安装Spark环境】

本文详细介绍了在Windows系统中配置Spark 3.5.8开发环境的完整流程。主要内容包括:安装JDK 8并配置环境变量,下载并解压Spark 3.5.8预编译版,设置SPARK_HOME系统变量,配置Hadoop的winutils工具解决Windows兼容性问题。通过spark-shell和SparkPi示例程序验证环境配置成功,确保Spark能够正常运行分布式计算任务。文中特别强调了路径命名规范、环境变量设置顺序等关键细节,提供了完整的配置截图和验证方法,帮助开发者快速搭建稳定的Spark学习环境。

pblh123的专栏 1588

C++函数模板

2、将声明和实现写到同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制。类模板作用:建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表。建立一个通用模板,其函数返回类型和形参类型可以不具体制定,用一个虚拟的类型来代表。1、当子类继承的父类是一个类模板时,子类在声明的时候,要指定出父类中T的类型。利用函数模板封装一个排序的函数,可以对不同的数据类型的数组进行排序。1、自动类型推导,必须推导出一致的数据类型T,才可以使用。2、模板必须要确定出T的数据类型,才可以使用。

jax_ton的博客 6527

【保姆级教程/代码】使用PRIDE PPP-AR软件解算ZTD、反演GNSS PWV,并评估精度

在本算例中,我下载了BJFS站2024年的IGS ZTD产品,用于评估PRIDE PPP-AR软件解算出ZTD结果的精度。

weixin_43910227的博客 2370

【C++】C++函数模板介绍及使用案例

函数模板的作用建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,不用为每一个类型定义新的函数。函数模板与函数重载函数重载:同一个函数名,不同类型参数,每个函数都需要具体实现出来。函数模板:只需要实现一个函数,也可以实现函数重载同样的功能。区别:函数重载函数体中的具体功能可以不同,更加灵活;对于同一功能,参数类型不同,二者作用一样。函数模板的定义//函数声明或定义,下面紧跟着对应的函数//括号中为模板参数列表,模板定义中,模板参数列表不能为空。template :声明创建模板的关键字。

qq_35902025的博客 5776

RPMsg:协议简介

两台计算机可以通过TCP/IP进行通信,那么同一颗芯片上的两个核心怎么通信呢?

SunnyZhou-1024的博客 1万+

SpringBoot3 + Vben5.0实战:从零搭建企业级管理后台(附完整代码)

本文详细介绍了如何从零开始,使用SpringBoot3与Vben5.0技术栈搭建现代化企业级管理后台。通过对比分析,阐述了该组合在开发效率、性能(如虚拟线程)和权限模型(RBAC)方面的优势,并提供了从项目初始化、核心功能开发到部署运维的完整实战指南,帮助开发者快速构建高性能、易维护的后台系统。

weixin_29306317的博客 172

c++函数模板

/ 函数体template关键字表示接下来的代码是一个函数模板的定义typename表示模板参数的类型T是一种类型参数的通用名字func_name即函数模板的名称。在 C++98 添加关键字 typename 之前,C++使用关键字 class 来创建模板。函数模板中的参数列表可以是任意数量的、任意类型的参数。在函数模板中,可以使用模板参数来表示参数的类型、函数返回值的类型等。

u012011912的博客 1330

【遥感数字图像处理(朱文泉)】第四章 变换域处理方法

变换域的处理方法

甜子yu的博客 4311

C++模板、类模板、函数模板详解都在这里了

C++模板、类模板、函数模板详解一、引言二、函数模板1、定义2、调用3、多个虚类型三、类模板1、定义2、调用四、类的函数模板五、类作为数据类型传入六、类模板与继承七、类模板与友元 一、引言 在写排序算法时,如果要写一个交换两个数据的函数,由于基本数据类型有int、float、double等等类型,所以针对每种数据类型可能我们要写很多swap函数,这些函数除了传入的数据类型不同,函数体结构大致相同。...

hsxyfzh的博客 1万+

Ansys Zemax | 利用OpticStudio实现衍射光学元件(DOE)与超透镜(metalens)的高效建模与验证

本文详细介绍了如何利用Ansys Zemax的OpticStudio软件实现衍射光学元件(DOE)与超透镜(metalens)的高效建模与验证。通过混合建模策略、相位面等效建模法、POP与FDTD联合验证等多种方法,帮助工程师快速解决跨尺度仿真难题,提升设计效率与精度。文章还分享了实战案例与高级技巧,适用于AR、医疗内窥镜等应用场景。

weixin_29268331的博客 501

AI奶牛TMR智能饲喂机器人 Qt信创完整项目( 统信/麒麟国产系统直接编译)

内置**犊牛、育成牛、围产牛、泌乳牛、干奶牛**5套标准化饲喂配方;+" 饲喂批次完成|牛群:"+grpText+"|投喂饲料:"+QString::number(ft)+"吨|剩料:"+QString::number(st)+"吨|异常牛:"+QString::number(abCow);cv::putText(frame,"霉变变质饲料禁止饲喂",cv::Point(20,40),cv::FONT_HERSHEY_SIMPLEX,0.7,cv::Scalar(0,0,255),2);

寒寒豆豆软件公司的博客 184

C++函数模板及实现原理

C++为我们提供了函数模板机制。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。 凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。     为什么要有函数模板     下面,我们就通过一个例子来说

常敲代码手不抖 2万+

PCL 欧式聚类(C++详细过程版)

为充分了解算法实现的每一个细节和有待改进的地方,使用C++代码对算法实现过程进行复现。

点云侠的博客 2449

cpp中的函数模板

之前我们讲了函数重载,对一个不同参数类型的函数作出了不同的行为,但是其实有一个更加高效的方式,那就是函数模板,也叫泛型编程。或者模板元编程。下面是一个交换两个元素的例子我们只需要在调用时指定类型就可以我们也可以指定两种类型,下面的程序没有什么实际意义,就是为了展示一下

Lyajpunov的博客 1434

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++函数模板的详细讲解【函数模板的概念、用法及其模板函数的概念知识】

目录前言C++函数模板的使用函数模板语法1.模板说明2.函数定义3.函数模板调用模板函数函数模板和函数重载 前言 C++提供了模板(template)编程的概念。所谓模板,实际上是建立一个通用函数或类,其类内部的类型和函数的形参类型不具体指定,用一个虚拟的类型来代表。这种通用的方式称为模板。模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。 C++函数模板的使用 为什么要有函数模板 例如,在一个项目中,有个项目需求是能够实现多个函数用来返回两个数的最大值,要求能支持char类型、int

m0_53636439的博客 5万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++ 函数模板基础

C++ 函数模板基础

英雄哪里出来 5075

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C++编程——函数模板

文章目录1 函数模板语法2 函数模板注意事项3 函模模板案例4 普通函数与函数模板的区别5 普通函数与函数模板的调用规则6 模板的局限性 模板就是建立通用的模具,大大提高复用性 模板的特点: 模板不介意直接使用,它只是一个框架 模板的通用并不是万能的 C++另一种编程思想称为泛型编程,主要利用的技术就是模板 C++提供两种模板机制:函数模板和类模板 本文介绍的是函数模型的知识 1 函数模板语法 函数模板作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表 语法: te

professor_tao的博客 6176

Cpp--C++中函数模板的用法详细解析

C++中的模板可分为函数模板和类模板,而把函数模板的具体化称为模板函数,把类模板的具体化成为模板类。下面让我们分别看看什么是函数模板和类模板吧 1.什么是模板 假设现在我们完成这样的函数,给定两个数x和y求式子x^2 + y^2 + x * y的值 .考虑到x和y可能是 int , float 或者double类型,那么我们就要完成三个函数: int fun(

samkieth 806

CPP_函数模板

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33727510的博客 437

C++ 函数模板(template)详解

目录 1.前言 2.为什么要使用函数模板 3.函数模板语法 3.1函数模板定义形式 4.函数模板和函数重载 4.1函数模板无法隐式数据类型转换 4.2当函数模板和普通函数都符合调用时,优先选择普通函数 4.3如果函数模板会产生更好的匹配,使用函数模板 4.3函数模板和普通函数在一起,调用规则 5.函数模板调用机制 1.前言 C++提供了模板(template)编程的概念。所谓模板,实际上是建立一个通用函数或类,其类内部的类型和函数的形参类型不具体指定,用一个虚拟的...

qq_54169998的博客 1万+

【C++之函数模板】数据排序

题目要求: 对n个数据进行从小到大排序,数据类型可以是整型、单精度型、双精度型,用函数模板。 ——谭浩强的《C++面向对象程序设计》第1章习题第14小题

霍喜猫的博客 4963
上一篇: C++ 静态成员变量与静态成员函数
下一篇: Qt 带参数的信号和槽函数
Meteor的笔记
博客等级 码龄9年 3220粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值