C++:函数模板整理

news2024/12/21 13:59:39

函数模板:

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

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

函数模板格式:

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;
}

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

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

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

相关文章

基于ARIMA+SARIMA的航空公司 RPM 时间序列预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

C++入门全集(4):类与对象【下】

一、再谈构造函数 1.1 构造函数体内赋值 我们知道&#xff0c;在创建对象时&#xff0c;编译器会自动调用构造函数给对象中的各个成员变量一个合适的初始值 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;}private:int _yea…

leetcode 长度最小的子数组

在本题中&#xff0c;我们可以知道&#xff0c;是要求数组中组成和为target的最小子数组的长度。所以&#xff0c;我们肯定可以想到用两层for循环进行遍历&#xff0c;然后枚举所有的结果进行挑选&#xff0c;但这样时间复杂度过高。 我们可以采用滑动窗口&#xff0c;其实就是…

网络加速CDN详细介绍

1、为什么要有网络加速 互联网从逻辑上看是一张大网&#xff0c;但实际上是由许多小网络组成的&#xff0c;这其中就有小网络“互连互通”的问题&#xff0c;典型的就是各个电信运营商的网络&#xff0c;比如国内的电信、联通、移动三大家。 这些小网络内部的沟通很顺畅&#…

c++之通讯录管理系统

1&#xff0c;系统需求 通讯录是一个记录亲人&#xff0c;好友信息的工具 系统中需要实现的功能如下&#xff1a; 1&#xff0c;添加联系人&#xff1a;向通讯录中添加新人&#xff0c;信息包括&#xff08;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;联系电话&#…

计算机网络-第2章 物理层

本章内容&#xff1a;物理层和数据通信的概念、传输媒体特点&#xff08;不属于物理层&#xff09;、信道复用、数字传输系统、宽带接入 2.1-2.2 物理层和数据通信的概念 物理层解决的问题&#xff1a;如何在传输媒体上传输数据比特流&#xff0c;屏蔽掉传输媒体和通信手段的差…

Java:三种代理模式示例

什么是代理模式&#xff1f; 代理&#xff08;Proxy&#xff09;是一种设计模式&#xff0c;为其他对象提供一种代理以控制对这个对象的访问。 代理模式的组成 抽象角色&#xff1a;通过接口或抽象类声明真实角色实现的业务方法。代理角色&#xff1a;实现抽象角色&#xff…

kibana自动补全功能失效的几个原因

文章目录 不能自动补全index&#xff1f;不能自动补全field&#xff1f; 不能自动补全index&#xff1f; 当用户在 kibana 的 Dev Tools 页面手写查询时&#xff0c;理应可以自动补全 index 的名称&#xff0c;如下图&#xff1a; 如果不能自动补全&#xff0c;则点击 Settin…

【网站项目】295演唱会购票系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

在线绘图利器:支持在线使用的电脑画图软件推荐!

计算机绘图软件是现代设计师和创作者必不可少的工具之一。伴随着技术的不断发展&#xff0c;越来越多的在线计算机绘图软件应运而生&#xff0c;为用户提供了更加便捷、高效的创作方法。对初学者而言&#xff0c;选择一款易于使用、功能强大的计算机绘图软件至关重要。本文将介…

Tomcat服务部署优化

目录 一.Tomcat的基本内容 1.概念 2.构成 &#xff08;1&#xff09;web容器 &#xff08;2&#xff09;servlet容器&#xff08;catalina&#xff09; &#xff08;3&#xff09;JSP容器 3.Tomcat顶层架构 &#xff08;1&#xff09;Tomcat中最顶层的容器是Server&…

DCFL: for Oriented Tiny Object Detection

文章目录 AbstractIntroductionContributionRelated Work定向目标检测微小目标检测多尺度学习标签分配上下文信息特征增强MethodOverview动态先验Coarse Prior MatchingFiner Dynamic Posterior MatchingAblation StudyAnalysis不平衡问题的调解可视化速度Conclusionhh 源代码 …

麒麟KYLINSOS服务器操作系统SP3安装

原文链接&#xff1a;安装麒麟服务器操作系统V10 SP3 在当今的IT环境中&#xff0c;内网仓库的部署对于确保网络安全、加快本地访问速度以及保持软件包的一致性至关重要。特别是对于企业和组织而言&#xff0c;内网仓库可以极大地提升工作效率和系统稳定性。今天&#xff0c;我…

ArmSoM Rockchip系列产品 通用教程 之 CAN 使用

CAN 使用 1. CAN 简介 CAN (controller Area Network)&#xff1a;控制器局域网络总线&#xff0c;是一种有效支持分布式控制或实时控制的串行通信网络。 目前世界上绝大多数汽车制造厂商都采用CAN总线来实现汽车内部控制系统之间的数据通信。 RK3568/RK3588的CAN驱动文件&a…

Effective objective-c-- 内存管理

Effective objective-c-- 内存管理 前言理解引用计数引用计数工作原理属性存取方法中的内存管理自动释放池保留环要点 以ARC简化引用计数使用ARC时必须遵循的方法和命名规则变量的内存管理语义ARC如何清理实例变量覆写内存管理方法要点 在dealloc方法中只释放引用并解除监听要点…

品牌与时间函数:在时间的长河中铸造品牌

品牌推广是一个与时间紧密相连的复杂过程。时间不仅是品牌推广的见证者&#xff0c;更是其推动者和塑造者。迅腾文化深刻理解品牌推广与时间之间的微妙关系&#xff0c;提出的“显”的原则&#xff0c;旨在通过巧妙的策略&#xff0c;使品牌在时间的流转中逐渐显现出其特别的魅…

Less is More: Generating Grounded Navigation Instructions from Landmarks

摘要 我们研究根据室内路线捕获的 360 图像自动生成导航指令。现有的生成器视觉基础较差&#xff0c;导致它们依赖语言先验并对物体产生幻觉。我们的 MARKY-MT5 系统通过关注视觉地标来解决这个问题&#xff1b;它包括第一级地标检测器和第二级生成器——多模式、多语言、多任…

基于springboot实现计算机类考研交流平台系统项目【项目源码+论文说明】

基于springboot实现计算机类考研交流平台系统演示 摘要 高校的大学生考研是继高校的高等教育更上一层的表现形式&#xff0c;教育的发展是我们社会的根本&#xff0c;那么信息技术的发展又是改变我们生活的重要因素&#xff0c;生活当中各种各样的场景都存在着信息技术的发展。…

U盘遇阻?解决“位置不可用”的困扰

U盘遇阻&#xff1a;当“位置不可用”成为难题 在数字化时代&#xff0c;U盘已成为我们存储和传输数据的重要工具。然而&#xff0c;当U盘突然提示“位置不可用”时&#xff0c;这无疑是一个令人头疼的问题。这不仅意味着我们无法访问存储在U盘中的文件&#xff0c;而且可能还…

PlantUML - 时序图

时序图主要内容 下面是一个简单的时序图&#xff0c;我们可以很容易并且美观的表达我们的交互流程&#xff0c;只需要在箭头的两边指定一个名字&#xff0c;加上描述即可&#xff1a; startuml bkloanapply -> bkloanapprove : request bkloanapprove --> bkloanapply :…