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++];
		else
			i++;
	}
	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;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linxu自动化构建工具make/Makefile究竟时什么?

Linxu自动化构建工具make/Makefile究竟时什么&#xff1f; 一、简介二、makefile文件制作&#xff08;简洁版&#xff09;2.1 源文件2.2 makefile如何制作2.2.1 依赖关系、依赖方法2.2.3 伪目标&#xff08;清理文件资源&#xff09; 三、make/Makefile自动化原理3.1 伪目标为什…

Lua 篇(一)— 安装运行Hello World

目录 前言一、Lua 是什么&#xff1f;二、Lua和C#的区别三、安装 LuaLinux 系统上安装Mac OS X 系统上安装Window 系统上安装emmyluaRider 安装(推荐) 四、Lua学习资料 前言 Lua 是一种轻量级的嵌入式脚本语言&#xff0c;它可以与 C 语言无缝集成&#xff0c;提供了强大的编程…

程序员的金三银四求职宝典:如何在关键时期脱颖而出?

个人主页&#xff1a;17_Kevin-CSDN博客 随着春天的脚步渐近&#xff0c;程序员们的求职热潮也随之而来。在这个被称为“金三银四”的招聘季&#xff0c;如何从众多求职者中脱颖而出&#xff0c;成为了许多程序员关注的焦点。本文将为你提供一份全面的求职宝典&#xff0c;助你…

程序员眼中的“祖传代码”

引言 在IT界&#xff0c;特别是在Java项目中&#xff0c;“祖传代码”通常指的是那些经过长时间积累、由多位开发者共同维护、且蕴含深厚技术沉淀的代码片段或模块。这些代码可能存在于项目的核心模块&#xff0c;也可能是一些辅助性的工具类。它们承载着项目的历史&#xff0…

vulhub中Wordpress 4.6 任意命令执行漏洞复现

由于Mysql初始化需要一段时间&#xff0c;所以请等待。成功运行后&#xff0c;访问http://your-ip:8080/打开站点&#xff0c;初始化管理员用户名和密码后即可使用&#xff08;数据库等已经配置好&#xff0c;且不会自动更新&#xff09;。 发送如下数据包&#xff0c;可见/tmp…

Kyuubi之Share Level

文章目录 Kyuubi介绍Spark thriftServer的问题Kyuubi架构 共享域参数CONNECTIONUSERGROUPSERVER Kyuubi介绍 Spark thriftServer的问题 STS面临以下的问题&#xff1a; 无法适应多租户场景。STS后端引擎仅仅启动一个application提供服务&#xff0c;提交用户和队列均为固定。…

Linux:Kubernetes(k8s)基础理论笔记(1)

我笔记来源的图片以及共享至GitHub&#xff0c;本章纯理论。这是k8s中部分的基础理论 &#x1f447; KALItarro/k8spdf: 这个里面只有一个pdf文件 (github.com)https://github.com/KALItarro/k8spdf&#x1f446; 什么是kubernetes kubernetes 是一个开源的&#xff0c;用于管…

TikTok企业认证教程:提升账号可信度的必备步骤

TikTok企业认证是TikTok平台用来验证账号真实性和权威性的方式。通过企业认证之后&#xff0c;企业能在TikTok上获得官方标识&#xff0c;可以增强品牌的专业形象&#xff0c;也有利于提升用户对企业内容的信任度。而且通过TikTok企业认证还可以解锁高级功能&#xff0c;如数据…

第105讲:Mycat垂直分表实战:从规划到解决问题的完整指南

文章目录 1.垂直分表的背景2.垂直分表案例实战2.1.垂直分表规划2.2.配置Mycat实现垂直分表2.3.重启Mycat2.4.在Mycat命令行中导入数据结构2.5.查看由Mycat分表后每个分片上存储的表2.6.Mycat垂直分表后可能遇到的问题2.7.垂直分表完成 1.垂直分表的背景 我们的商城系统数据库&…

基于springboot实现乐器社区网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现乐器社区网站系统演示 摘要 音乐一直以来都是人们非常喜爱的一种休闲娱乐的方式&#xff0c;人们在聆听音乐时可以全身心的进行放松&#xff0c;从音乐中可以获得认同感&#xff0c;可以与音乐进行情感的交流。而音乐的组成形式也是多样的&#xff0c;现代…

AP8854 DC-DC降压恒压 12V 6A过EMI线路图 宽电压电源管理IC

产品描述 AP8854 一款宽电压范围降压型 DC-D电源管理芯片&#xff0c;内部集成使能开关控制、基准电源、误差放大器、过热保护、限流保护、短路保护等功能&#xff0c;非常适合宽电压输入降压使用。AP8854 带使能控制&#xff0c;可以大大节省外围器件&#xff0c;更加适合电池…

六、继承(一)

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…

Hackthebox - Authority

#ansible #Certify 赛博雨天&#xff1a;https://yutianqaq.github.io/ Recon smb smbmap -H 10.10.11.222 -u 挂载 smb 到 kali mount -t cifs //10.10.11.222/Development ./smb -o usernamesmb 在 cat smb/Automation/Ansible/PWM/defaults/main.yml 得到 ansible 的加…

循环队列与循环双端队列

文章目录 前言循环队列循环双端队列 前言 1、学习循环队列和循环双端队列能加深我们对队列的理解&#xff0c;提高我们的编程能力。 2、本文循环队列使用的是数组&#xff0c;循环双端队列用的是双向链表 3、题目连接&#xff1a;设计循环队列 &#xff0c;设计循环双端队列。 …

2024高频前端面试题 HTML 和 CSS 篇

JS和ES6 篇&#xff1a; ​​​​​​​2024高频前端面试题 JavaScript 和 ES6 篇-CSDN博客 一 . HTML 篇 1. H5有什么新特性 1) 语义化标签 用正确的标签做正确的事情。 html 语义化让页面的内容结构化&#xff0c;结构更清晰&#xff0c;便于对浏览器、搜索引擎解析&…

Springboot实现缓存预热

很多时候我们代码中使用缓存时都是先判断缓存中没有数据我们再读取数据库而有则直接使用缓存数据&#xff0c;而在系统冷启动(当系统重启或新启动时&#xff0c;缓存是空的&#xff0c;这被称为冷启动)时&#xff0c;我们毫无意外都是直接获取数据库的内容&#xff0c;这时候缓…

Pytorch Geometric 将表格数据集(CSV 文件)转换为图形数据集

导 读 如今图数据集正在以惊人的速度出现&#xff0c;所有化学分子、社交网络和推荐系统主要以图数据结构的形式存储数据 有需要的朋友关注公众号【小Z的科研日常】&#xff0c;获取更多内容。 01、如何转换CSV文件至图形数据结构 确定图形数据所需的基本信息 节点&#xff08;…

ViT的若干细节

之前只看了ViT的大概结构&#xff0c;具体的模型细节和代码实现知之甚少。随着ViT逐渐成为CV领域的backbone&#xff0c;有必要重新审视下。 patch -> token 为了将图片处理成序列格式&#xff0c;很自然地想到将图片分割成一个个patch&#xff0c;再把patch处理成token。 …

Go-知识struct

Go-知识struct 1. struct 的定义1.1 定义字段1.2 定义方法 2. struct的复用3. 方法受体4. 字段标签4.1 Tag是Struct的一部分4.2 Tag 的约定4.3 Tag 的获取 githupio地址&#xff1a;https://a18792721831.github.io/ 1. struct 的定义 Go 语言的struct与Java中的class类似&am…

数据结构c版(2)——二叉树

本章我们来了解一下二叉树这一概念。 目录 1.树概念及结构 1.1树的概念​​​​​​​ 1.2 树的特点&#xff1a; 1.3 树的相关概念 1.4 树的表示​​​​​​​ 1.5 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 …