71.函数模板

        函数模板是C++中一种通用编程技术,允许编写可以适用于多种数据类型的函数,而无需为每种数据类型编写不同的函数。函数模板通过参数化类型来实现通用性,可以在不同情况下自动生成具体的函数代码。

目录

1.函数模板的定义

2.函数模板的使用 

3.函数模板与普通函数

4.函数模板的局限性 


1.函数模板的定义

函数模板以 template 关键字开始,后面跟着尖括号(<>),其中包含一个或多个类型参数。

template <typename T>
T myMax(T a, T b) {return (a > b) ? a : b;
}

        如果我需要再对两个float类型的变量进⾏交换,是不是还需要再写⼀个函数呢?需要交换的变量的类型越多,我就越需要写更多的重复的函数,而且⼀旦需求变更了,交换的逻辑需要做⼀些小小的改变。那么每⼀个函数我都得修改⼀下,非常的复杂
        我如果能够设计⼀个通用的函数,能够把类型当作参数传递到这个函数中,就可以简化很多很多的⼯作了!这就是函数模板! 

// 需求:我想要设计⼀个函数,实现两个int变量的值的交换
void mySwap(int& a, int& b) {int tmp = a;a = b;b = tmp;
}
// 需求:我想要设计⼀个函数,实现两个double变量的值的交换
void mySwap(double& a, double& b) {double tmp = a;a = b;b = tmp;
}
template<typename T>
void mySwap(T& a, T& b) {T tmp = a;a = b;b = tmp;
}

2.函数模板的使用 

template<class T>
void mySwap(T& a, T& b) {T tmp = a;a = b;b = tmp;
}
int main() {int a = 10, b = 20;double x = 3.14, y = 0.99;// 1. 显式指定类型mySwap<int>(a, b);// 2. 可以⾃动根据实参的类型进⾏推导mySwap(a, b);    // 这⾥调⽤的mySwap中,类型T被推导为int类型mySwap(x, y);    // 这⾥调⽤的mySwap中,类型T被推导为double类型// 注意事项: 类型推导的时候,需要保证⼀致性。不满⾜⼀致性⽆法推导。// 例如 mySwap(a, y);  // 第⼀个实参a是int类型,推导T的类型为int;第⼆个实参y是double类型,推导T的类型为double;
不⼀致return 0;
}

3.函数模板与普通函数

        在以下示例中,add 函数模板可以处理 intdouble 类型的参数,而普通函数 add 仅能处理 int 类型参数。函数模板实现了更广泛的通用性和类型安全性。

// 函数模板
template <typename T>
T add(T a, T b) {return a + b;
}// 普通函数
int add(int a, int b) {return a + b;
}int main() {int x = 5, y = 10;double p = 3.14, q = 2.71;int result1 = add(x, y); // 调用普通函数double result2 = add(p, q); // 调用函数模板return 0;
}

4.函数模板的局限性 

函数模板虽然很通用,但并不是万能的,有的时候也会出现不适配的情况。

template<class T>
bool compare(const T& t1, const T& t2) {return t1 > t2;
}

        对于上述的模板函数来说,如果是比较整形、浮点型甚至字符型的数据是没有问题的。可是如果我们设置为person类呢?两个person对象无法进行大小比较,这里也就自然的出现了问题。

 那么如何解决这样的问题呢?
1. 重载运算符,重载>运算符。
2. 通过函数模板的重载来解决。


        函数模板的重载,就是为了解决特定类型的对象的问题,通过函数模板的重载,可以为这些特定的数据类型提供具像化的模板。

class Person {
public:int age;
};
template<class T>
bool compare(const T& t1, const T& t2) {return t1 > t2;
}
template<>
bool compare<Person>(const Person& p1, const Person& p2) {return p1.age > p2.age;
}
int main() {Person p1;p1.age = 15;Person p2;p2.age = 12;cout << compare(p1, p2) << endl;return 0;
}

        由于我们在特化的 compare 函数中定义了如何比较两个 Person 对象的年龄属性,因此在 main 函数中调用 compare(p1, p2) 时,实际上是调用了特化版本的 compare 函数,返回的结果是根据年龄比较的结果。

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

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

相关文章

组合拳SSRF+redis未授权访问

目录 一、SSRF 二、redis未授权访问 三、组合利用 1.写入Webshell 2.反弹shell 一、SSRF 一台web服务器对其他服务器发起请求&#xff0c;以加载其他服务器的web内容或数据 但因请求参数没有进行严格过滤&#xff0c;攻击者可能会通过SSRF漏洞来访问敏感数据、执行未经授…

springcloud3 分布式事务-产生原因的模拟1

一 分布式事务 1.1 分布式事务产生条件 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下&#xff0c;产生的事务&#xff0c;例如&#xff1a; 1.跨数据源的分布式事务 2.跨服务的分布式事务 3.综合情况 二 案例操作 2.1 原理架构 订单的创建、库存的扣…

Spring常见面试题总结

什么是Spring Spring是一个轻量级Java开发框架&#xff0c;目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题&#xff0c;以提高开发效率。它是一个分层的JavaSE/JavaEE full-stack&#xff08;一站式&#xff09;轻量级开源框架&#xff0c;为开发Java应用程序…

vue+express、gitee pm2部署轻量服务器

一、代码配置 前后端接口都保持 127.0.0.1:3000 vue创建文件 pm2.config.cjs module.exports {apps: [{name: xin-web, // 应用程序的名称script: npm, // 启动脚本args: run dev, // 启动脚本的参数cwd: /home/vue/xin_web, // Vite 项目的根目录interpreter: none, // 告诉…

RabbitMQ - 如保证消息的可靠性?

目录 一、消息可靠性 1.1、生产者消息确认&#xff08;生产者角度&#xff09; 1.1.1、理论 1.1.2、实践 1.2、消息持久化&#xff08;消息角度&#xff09; 1.2.1、理论 1.3、消费者消息确认&#xff08;消费者角度&#xff09; 1.3.1、理论 1.3.2、实践 1.4、失败重…

关于vue.config.js

关于vue.config.js 简述 vue.config.js是一个可选的配置文件&#xff0c;如果项目的根目录中存在这个文件&#xff0c;那么它就会被vue/cli-service自动加载。你也可以使用package.json中的vue字段&#xff0c;但是注意这种写法需要你严格遵守JSON的格式来写。 这个文件应该…

Matlab图像处理-Lab模型

Lab模型 Lab模型是由CIE&#xff08;国际照明委员会&#xff09;制定的一种彩色模型。该模型与设备无关&#xff0c;弥补了RGB模型和CMYK模型必须依赖于设备颜色特性的不足&#xff1b; 另外&#xff0c;自然界中的任何颜色都可以在Lab空间中表现出来&#xff0c;也就是说RGB和…

20230917后台面经总结

1.ping底层原理 Ping 是 ICMP 的一个重要应用&#xff0c;主要用来测试两台主机之间的连通性。Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文&#xff0c;目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。 基…

Unity之手游UI的点击和方向移动

一 Button的点击 1.1 新建UI -> Button 1.2 在Button上面右击添加空物体 1.3 创建脚本挂载到空物体上面 脚本内容添加点击方法&#xff0c;来控制物体的显示隐藏 using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using Unit…

Nginx 文件解析漏洞复现

一、漏洞说明 Nginx文件解析漏洞算是一个比较经典的漏洞&#xff0c;接下来我们就通过如下步骤进行漏洞复现&#xff0c;以及进行漏洞的修复。 版本条件&#xff1a;IIS 7.0/IIS 7.5/ Nginx <8.03 二、搭建环境 cd /vulhub/nginx/nginx_parsing_vulnerability docker-compos…

【C++基于多设计模式下的同步异步日志系统】

文章目录 [toc] 1 :peach:项目介绍:peach:2 :peach:开发环境:peach:3 :peach:核心技术:peach:4 :peach:环境搭建:peach:5 :peach:日志系统介绍:peach:5.1 :apple:为什么需要日志系统&#xff1f;:apple:5.2 :apple:日志系统技术实现:apple:5.2.1 :lemon:同步写日志:lemon:5.2.2…

【excel密码】excel文件加密的三种方式

想要给Excel文件进行加密&#xff0c;方法有很多&#xff0c;今天分享三种Excel加密方法给大家。 一、打开密码 设置了打开密码的excel文件&#xff0c;打开文件就会提示输入密码才能打开excel文件&#xff0c;只有输入了正确的密码才能打开并且编辑文件&#xff0c;如果密码…

Unity实现简易太阳系

开发环境&#xff1a;Unity 2022.3.5f1c1 Visual Studio 2022 太阳系相关星体&#xff1a;太阳、八大行星、月球 模拟星系&#xff1a;太阳系、地月系 功能&#xff1a;支持行星以太阳为中心&#xff0c;任意轴进行公转&#xff0c;此处演示同一平面。 a1-a8为公转轴&#xff…

spring-kafka中ContainerProperties.AckMode详解

近期&#xff0c;我们线上遇到了一个性能问题&#xff0c;几乎快引起线上故障&#xff0c;后来仅仅是修改了一行代码&#xff0c;性能就提升了几十倍。一行代码几十倍&#xff0c;数据听起来很夸张&#xff0c;不过这是真实的数据&#xff0c;线上错误的配置的确有可能导致性能…

《ADS2011射频电路设计与仿真实例》功率放大器设计的输入输出匹配

徐兴福这本书的6.6 Smith圆图匹配这一节中具体匹配时&#xff0c;直接给出了电容与串联微带的值&#xff0c;没有给出推导过程&#xff0c;我一开始以为是省略了详细推导过程&#xff0c;后来发现好像基本上是可以随便自己设的。以输入匹配&#xff08;书本6.6.4输入匹配电路的…

【Vue】避免Vue组件中常见的props默认值陷阱

1. 对象和数组默认值的共享问题 当你将一个对象或数组作为props的默认值时&#xff0c;它们会在组件的所有实例之间共享。这意味着如果一个组件修改了这个默认值&#xff0c;其他组件也会受到影响&#xff0c;因为它们共享同一个引用。 陷阱&#xff1a; props: {userInfo: …

景联文科技:数据供应商在新一轮AI热潮中的重要性

景联文科技是AI基础行业的头部数据供应商&#xff0c;可协助人工智能企业解决整个人工智能链条中数据标注环节的相对应问题。 随着全球新一轮AI热潮来袭&#xff0c;大量训练数据已成为推动AI算法模型进步和演化的不可或缺的重要因素。数据的质量和数量直接影响了模型训练和性能…

基于STM32设计的校园一卡通(设计配套的手机APP)

一、功能介绍 【1】项目介绍 随着信息技术的不断发展,校园一卡通作为一种高效便捷的管理方式,已经得到了广泛的应用。而其核心部件——智能卡也被越来越多的使用者所熟知。 本文介绍的项目是基于STM32设计的校园一卡通消费系统,通过RC522模块实现对IC卡的读写操作,利用2…

现在全国融资融券两融利率最低是多少?哪家证券公司券商费率低?

融资融券是指投资者通过向券商借入资金&#xff08;融资&#xff09;或借入证券&#xff08;融券&#xff09;&#xff0c;以达到获得更高收益、降低交易风险、提高资金利用效率的目的。通过融资&#xff0c;投资者可以用借入的资金买入更多的证券&#xff1b;通过融券&#xf…

多目标优化算法:基于非支配排序的海象优化算法(NSWOA)MATLAB

一、海象优化算法WOA 海象优化算法&#xff08;Walrus Optimization Algorithm&#xff0c;WOA&#xff09;由Trojovsk等人于2023年提出&#xff0c;该算法模拟海象的进食&#xff0c;迁移&#xff0c;逃跑和对抗捕食者的过程&#xff0c;WOA包含探索、迁移和开发三个阶段&…