C++:函数模板整理

函数模板:

找到函数相同的实现思路,区别于函数的参数类型。

使用函数模板使得函数可容纳不同类型的参数实现函数功能,而不是当类型不同时便编译大量类型不同的函数,产生大量重复代码和内存占用

函数模板格式:

template<typename T, typename T2...>
函数返回值类型 函数名(模板形参表)
{//函数主体;//...
}

格式说明:

  1. template:声明函数模板的关键字;
  2. typename: 模板类型关键字(”class“亦可),后+ 模板类型名;
  3. T:通用类型名
  4. <>:可容纳多个类型参数,中间逗号隔开,参数数量与模板函数参数一致;

举例:

#include <iostream>
#include <string>
using namespace std;template<typename T, typename T2>
int compare(const T& a, const T2& b)
{if (a > b)return 1;else if (a == b)return 0;else return -1;
}
int main()
{int a = 4;int b = 5;cout <<"compare(a,b):"<< compare(a, b) << endl;cout<<"compare(4,5.5):"<<compare(4, 5.5) << endl;cout <<"compare(111, 5.4):"<< compare(111, 5.4) << endl;string c = "abc";string c1 = "abc";string d = "def";cout <<"string 比较:"<< compare(c1,c) << endl;cout << "string 比较:" << compare(c1, d) << endl;return 0;
}

代码说明:

  1. 一个函数可以包含不同类型的参数,也就可以包含不同模板类型 T;
  2. 不同参数类型的函数模板,在实参满足函数实现方法的前提下,可以处理相同类型的实参,亦可以处理不同类型的实参;

错误警告:

该函数模板不能判断字符串大小,仅能判断string类,因为字符串比较不能通过“>""<""==”,而是strcmp()函数,不满足函数实现方法,所以得到错误答案。

函数模板实例化:

template<typename T>
int compare(const T& v1, const T& v2)
{if (v1 > v2) return 1;if (v2 > v1) return -1;return 0;
}int a = 10;int b = 20;
cout << compare(a, b) << endl; 
//a,b是int,推断 T是intdouble c = 12.4; 
double d = 8.6;
cout << compare(c, d) << endl;
//c,d为double,推断T是double

当我们调用函数模板时,模板中空缺的模板参数由实参决定;

当函数调用的实参为int 时,函数模板告诉编译器模板参数T 为int ,编译器则重新以函数模板创建参数为int 的函数,实参为double 时同理。

编译要求:

函数模板的声明和定义需要在同一文件里

实参推断:

当函数模板调用时,如果函数实参无法直接推断出函数的模板类型,则需要自行显式指定

template<typename T>
T Max(T a, T b)
{cout << "T Max(T,T)" << endl;return a > b ? a : b;
}int main()
{//可以直接推断int a = Max(10, 20);//错误,不能通过实参推断出模板实参//int b = Max(200, 'a');return 0;
}

引例:

    int c = Max<int>(200,'a');//可以,显式类型转换,可以通过实参推断int d = Max(200,(int)'a');int e =Max((char)200,'a');

函数模板重载:

函数模板重载,区别于参数列表不同;

一个文件里可以存在多个同名普通函数与重载的函数模板,但是普通函数的优先级高于函数模板

获取两个参数的最大值
template<typename A1>
A1 Max(const A1& a, const A1& b)
{cout << "函数模板:" << endl;return (a >= b ? a : b);
}//返回数组最大值:
template<typename B>
B Max(const B* b, int n)
{int i = 0;B max = b[0];while (i < n){if (max < b[i])max = b[i++];elsei++;}cout << "函数模板:" << endl;return max;
}
//返回字符串最大值:
char* Max(char* c1, char* c2)
{cout << "普通函数:" << endl;int i = strcmp(c1, c2);if (i == 1)return c1;else return c2;
}
int Max(int a, int b)
{cout << "普通函数:" << endl;return a > b ? a : b;
}
int main()
{//普通函数char a[] = {"abc"};char b[] = { "bcd" };cout << Max(a, b) << endl;int c = 2, d = 3;cout << Max(c, d) << endl;int t[] = { 1,2,3,4,5 };cout << Max(t, sizeof(t) / sizeof(t[0])) << endl;
}

第二组输出,属于可以匹配普通函数,亦可以匹配函数模板,但是普通函数的优先级高,则选择普通函数。

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

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

相关文章

[Vulnhub]靶场 Red

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 …

ARM64汇编02 - 寄存器与指令基本格式

最近的文章可能会有较多修改&#xff0c;请关注博客哦 异常级别 ARMv8处理器支持4种异常等级&#xff08;Exception Level&#xff0c;EL&#xff09;。 EL0 为非特权模式&#xff0c;用于运行应用程序&#xff0c;其他资源访问受限&#xff0c;权限不够。 EL1 为特权模式&…

【王道操作系统】ch1计算机系统概述-06虚拟机

文章目录 【王道操作系统】ch1计算机系统概述-06虚拟机01传统计算机02虚拟机的基本概念&#xff08;1&#xff09;第一类虚拟机管理程序&#xff08;2&#xff09; 第二类虚拟机管理程序&#xff08;3&#xff09; 两类虚拟机管理程序的对比 【王道操作系统】ch1计算机系统概述…

效果炸裂、刷爆各大视频网站的EMO到底是怎么做到的?

文章链接&#xff1a;https://arxiv.org/abs/2402.17485 今天分享的工作是刷爆各大视频平台的EMO的背后的工作原理。提出的初衷是着手解决增强发言者的头部特写视频生成中的现实感和表现力的挑战&#xff0c;重点关注音频提示与面部动作之间的动态和微妙关系。传统技术具有局限…

【HarmonyOS】鸿蒙开发之Stage模型-UIAbility的启动模式——第4.4章

UIAbi lity的启动模式简介 一共有四种:singleton,standard,specified,multion。在项目目录的:src/main/module.json5。默认开启模式为singleton(单例模式)。如下图 singleton&#xff08;单实例模式&#xff09;启动模式 每个UIAbility只存在唯一实例。任务列表中只会存在一…

测试管理进阶 | 量力而行:避免成为替罪羊

职场中,我们常常面临是否帮助他人的抉择。尽管善良是美德,但过度的好人卡可能会给自己带来麻烦。本文将探讨如何在职场中量力而行,避免成为替罪羊,以及如何保持高效和合理的职责划分。 我们在工作中常常会遇到一些需要帮助他人的情况,作为团队的一员,我们希望能够积极地协…

六、继承(一)

1 继承的引入 以往我们想分别实现描述学生、老师的类&#xff0c;可能会这样子做&#xff1a; class Student {string _name;string _number;int _tel;int id;string _address;int _age; }; class Teacher {string _name;int _level;int _tel;int id;string _address;int _ag…

【归并排序】 详细解析 动图演示 逐图解析 洛谷P1177【模板】排序 sort【快速排序】

文章目录 归并排序1.归并排序的复杂度分析2.细节解释3.归并排序动图演示3(1) 我们的拆分过程如下↓ 4.code↓ 洛谷P1177【模板】排序数据规模与约定code&#xff08;归并排序&#xff09;↓code&#xff08;sort排序【快速排序】&#xff09; 完结撒花(&#xffe3;▽&#xff…

数据中台:数字中国战略关键技术实施

这里写目录标题 前言为何要建设数据中台数据中台建设痛点数据中台学习资料聚焦前沿&#xff0c;方法论体系更新与时俱进&#xff0c;紧跟时代热点深入6大行业&#xff0c;提炼实践精华大咖推荐&#xff0c;数字化转型必备案头书 前言 在数字中国这一国家战略的牵引下&#xff0…

基于springboot+vue的响应式企业员工绩效考评系统(源码+论文)

文章目录 前言 一、功能设计 1 普通员工功能 2 主管功能 3 系统管理员功能 4 评分标准功能 5 PC端与手机端 6 制图 二、功能实现 普通员工 1普通员工登录 2公告板块 3日志板块 主管 1主管登录 2公告板块 3日志板块 4绩效评分板块 5个人信息板块 系统管理员…

在 Linux 环境下安装 Kibana

目录 一、Kibana 是什么 二、在 Linux 环境下安装 Kibana 1、下载安装包 2、解压 3、修改 Kibana的配置文件 config/kibana.yml 4、启动 5、浏览器登录 Kibana 6、测试查询 一、Kibana 是什么 Kibana 是通向 Elastic 产品集的窗口。 它可以在 Elasticsearch 中对数据进…

品牌推广的两种飞轮:非酋飞轮与欧皇飞轮

在品牌推广的世界里&#xff0c;存在着两种截然不同的飞轮效应&#xff0c;我们称之为“非酋飞轮”与“欧皇飞轮”。这两种飞轮象征着品牌发展的两种不同路径和策略&#xff0c;而迅腾文化则以其独特的“繁”的原则&#xff0c;巧妙地将这两种飞轮结合&#xff0c;助力品牌形成…

Linux安装JumpServer并结合内网穿透实现公网访问本地服务

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Kubernetes 学习总结(46)—— Pod 不停重启问题分析与解决

我们在做性能测试的时候&#xff0c;往往会发现我们的pod服务&#xff0c;频繁重启&#xff0c;通过kubectl get pods 命令&#xff0c;我们来逐步定位问题。 现象:running的pod&#xff0c;短时间内重启次数太多。 定位问题方法:查看pod日志 kubectl get event …

1、EmlogCms代码审计

一、SQL注入 1、后台标签删除处存在1处sql注入 漏洞条件 ● 漏洞url: http://emlog6.0.com/admin/tag.php?actiondell_all_tag ● 漏洞参数&#xff1a;tag[xx] ● 是否存在限制&#xff1a;无 ● 是否还有其他条件&#xff1a;actiondell_all_tag,token复现 POST /admin…

撸chatgpt3.5 api backend-api 对接wxbot

功能是实现 web 转api 对接wxbot用&#xff0c; 直接上代码&#xff0c; 1.获取wss url def get_register_websocket():# 请求头url "https://chat.openai.com/backend-api/register-websocket"payload {}headers {Authorization: Bearer eyJhbGxxxxxxxxxxxxx…

docker的网络配置

文章目录 1、网络模式1.1、bridge模式(默认模式)1.2、host模式 2、bridge模式3、自定义网络 1、网络模式 Docker在创建容器时有四种网络模式&#xff1a;bridge/host/container/none&#xff0c;bridge为默认不需要用–net去指定&#xff0c;其他三种模式需要在创建容器时使用…

案例介绍:汽车维修系统的信息抽取技术与数据治理应用(开源)

一、引言 在当今汽车产业的快速发展中&#xff0c;软件已经成为提升车辆性能、安全性和用户体验的关键因素。从车载操作系统到智能驾驶辅助系统&#xff0c;软件技术的进步正在重塑我们对汽车的传统认知。我有幸参与了一个创新项目&#xff0c;该项目专注于开发和集成先进的汽…

关于 svg path 路径坐标 精度误差问题

<svg width"2838.739990" height"2482.179932" viewBox"0 0 2838.74 2482.18" fill"none" xmlns"http://www.w3.org/2000/svg" xmlns:xlink"http://www.w3.org/1999/xlink"><path id"矢量 12"…

原理篇-- 定时任务xxl-job-服务端(admin)项目启动过程--JobRegistryHelper 初始化 (4)

文章目录 前言一、JobRegistryHelper 作用&#xff1a;二、JobRegistryHelper 源码介绍&#xff1a;2.1 初始化start() 方法&#xff1a;2.1.1 registryOrRemoveThreadPool 执行器注册和移除&#xff1a;2.1.2 registryMonitorThread 执行器注册监控线程&#xff1a; 2.2 toSto…