C++泛型编程:函数模版定义、函数模版调用,与普通函数调用区别

news2025/1/8 20:16:17

泛型编程:这个是一种编程范式,他的目的是编写适合多种数据类型的代码。

函数模版:

template<typename t>

函数的定义

我们来结合代码理解一下内容,首先定义好函数,然后我们通过方式来调用下,有两种调用函数的方式,一种是自动类型推到,另一种是显式指定类型

调用有两种模式:第一种是自动类型推导:

#include<iostream>
using namespace std;

// 函数模版
/*
template<typename T>
函数的定义

*/
template<typename T>
T ADD(T c, T d) {
	T e = c + d;
	return e;
}

int main() {
	int a = 2, b = 3;
	int c;
	c = ADD(a, b);
	double a1 = 2.0, b1 = 4.5;
	double c1;
	c1 = ADD(a1, b1);
	cout << c << endl;
	cout << c1 << endl;
	return 0;
}

第二种是显示指定类型:

#include<iostream>
using namespace std;

// 函数模版
/*
template<typename T>
函数的定义

*/
template<typename T>
T ADD(T c, T d) {
	T e = c + d;
	return e;
}

int main() {
	int a = 2, b = 3;
	int c;
	c = ADD<int>(a, b);
	double a1 = 2.0, b1 = 4.5;
	double c1;
	c1 = ADD<double>(a1, b1);
	cout << c << endl;
	cout << c1 << endl;
	return 0;
}

与普通函数调用区别

普通函数可以进行隐式类型转化,函数模版这里是无法进行隐式类型转化(自动类型推导),见以下代码示例:

#include<iostream>
using namespace std;

// 函数模版
/*
template<typename T>
函数的定义

*/
double adddouble(double a, double b) {
	double c = a + b;
	return c;
}
template<typename T>
T ADD(T c, T d) {
	T e = c + d;
	return e;
}

int main() {
	int a = 2, b = 3;
	int c;
	c = ADD(a, b);
	double a1 = 2.0, b1 = 4.5;
	double c1;
	//c1 = ADD(a1, b);// 显示报错,无法进行隐式类型转化
	cout << c << endl;
	cout << c1 << endl;
	double cc = adddouble(2, 3);// 可以进行隐式类型转化
	return 0;
}

普通函数可以进行隐式类型转化,函数模版这里是可以进行隐式类型转化(显示指定类型),见以下代码示例:

#include<iostream>
using namespace std;

// 函数模版
/*
template<typename T>
函数的定义

*/
double adddouble(double a, double b) {
	double c = a + b;
	return c;
}
template<typename T>
T ADD(T c, T d) {
	T e = c + d;
	return e;
}

int main() {
	int a = 2, b = 3;
	int c;
	c = ADD(a, b);
	double a1 = 2.0, b1 = 4.5;
	double c1;
	c1 = ADD<int>(a1, b);// 可以进行隐式类型转化
	cout << c << endl;
	cout << c1 << endl;
	double cc = adddouble(2, 3);// 可以进行隐式类型转化
	return 0;
}

他和普通函数的调用顺序,有那些规则呢?规则一:如果是普通函数和函数模版是同名的话,调用类型正好匹配的、都可以调用的情况下,优先调用普通函数(自动类型推导)。规则二:如果是(显示指定类型)的话,就调用函数模版,就是强制调用函数模版,见以下代码:

#include<iostream>
using namespace std;

// 函数模版
/*
template<typename T>
函数的定义

*/
double ADD(double a, double b) {
	cout << "调用普通函数" << endl;
	double c = a + b;
	return c;
}
template<typename T>
T ADD(T c, T d) {
	cout << "调用函数模版" << endl;
	T e = c + d;
	return e;
}

int main() {

	double a1 = 2.0, b1 = 4.5;
	double c1;
	//c1 = ADD(a1, b1);// 优先调用普通函数
	c1 = ADD<double>(a1, b1); // 强制调用函数模版

	return 0;
}

规则三:如果是“不”(显示指定类型)的话,如何会调用函数模版呢?编译器在函数同名情况下,它会优先选择类型最匹配的函数,如果匹配不到的话,就会调用函数模版,见以下代码:

#include<iostream>
using namespace std;

// 函数模版
/*
template<typename T>
函数的定义

*/
int ADD(int a, int b) {
	cout << "调用普通函数" << endl;
	int c = a + b;
	return c;
}
template<typename T>
T ADD(T c, T d) {
	cout << "调用函数模版" << endl;
	T e = c + d;
	return e;
}

int main() {

	double a1 = 2.0, b1 = 4.5;
	double c1;
	c1 = ADD(a1, b1);

	return 0;
}

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

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

相关文章

win10 VS2019上libtorch库配置过程

win10 VS2019上libtorch库配置过程 0 引言1 获取libtorch2 在VS上配置使用libtorch库3 结语 0 引言 &#x1f4bb;&#x1f4bb;AI一下&#x1f4bb;&#x1f4bb;   libtorch库是一个用于深度学习的C库&#xff0c;是PyTorch的官方C前端。它提供了用于构建和训练深度学习模…

Windows 环境配置 HTTPS 服务实战

一、 环境准备 win10以上操作系统安装 Certbot申请阿里云\腾讯云域名安装 nginx 1.3以上版本 二、Certbot 安装及 SSL 证书生成 Certbot 是一个免费、开源工具&#xff0c;用于自动化在Web服务器上获取和更新SSL/TLS证书。它可以通过Let’s Encrypt服务获取免费的SSL/TLS证书…

【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】

目录&#x1f60b; 任务描述 相关知识 带权无向图 建立邻接矩阵 Prim算法 1. 算法基本概念 2. 算法背景与目标 3. 算法具体步骤 4. 算法结束条件与结果 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序求图的最小生成树。 相关知识 为了完成…

11.认识异常

本节目标 1.异常概念与体系结构 2.异常的处理方式 3.异常的处理流程 4.自定义异常类 1.异常的概念与体系结构 1.1异常的概念 在Java中,将程序执行过程中发生的不正常行为称为异常,比如: 1.算术异常 System.out.println(10/0);//执行结果 Exception in thread "mai…

基于海思soc的智能产品开发(camera sensor的两种接口)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于嵌入式开发设备来说&#xff0c;除了图像显示&#xff0c;图像输入也是很重要的一部分。说到图像输入&#xff0c;就不得不提到camera。目前ca…

vulnhub靶场-potato(至获取shell)

arp-scan -l 扫描IP 使用御剑端口扫描扫描端口&#xff0c;扫到了80和7120两个端口&#xff0c;其中7120为ssh端口 使用dirb http://192.168.171.134 扫描目录 发现info.php 访问为phpinfo界面 访问192.168.171.134为一个大土豆&#xff0c;没什么用 所以我们从ssh入手 盲…

Flutter:邀请海报,Widget转图片,保存相册

记录下&#xff0c;把页面红色区域内的内容&#xff0c;转成图片后保存到相册的功能 依赖 # 生成二维码 qr_flutter: ^4.1.0 # 保存图片 image_gallery_saver_plus: ^3.0.5view import package:demo/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; i…

Milvus×合邦电力:向量数据库如何提升15%电价预测精度

01. 全球能源市场化改革下的合邦电力 在全球能源转型和市场化改革的大背景下&#xff0c;电力交易市场正逐渐成为优化资源配置、提升系统效率的关键平台。电力交易通过市场化手段&#xff0c;促进了电力资源的有效分配&#xff0c;为电力行业的可持续发展提供了动力。 合邦电力…

网络层协议之IP数据包层分片随笔

1.全篇内容均在图中&#xff0c;如何分片以及分片举例细节拆解&#xff0c;见下图: 1.1分片公式&#xff1a; 上述公式中有关/8 再*8目的是为了使用8字节对齐&#xff0c;从而使的分片数据包均为8字节整数倍&#xff01; 1.2.ip层数据包分片计算&图解

TDengine + MQTT :车联网时序数据库如何高效接入

现代新能源汽车&#xff0c;作为一种内部系统极为复杂的交通工具&#xff0c;配备了大量传感器、导航设备、应用软件&#xff0c;这些传感器产生的数据都需要上报到车联网平台当中。对于这些车辆的状态数据&#xff08;如车速、发动机转速等&#xff09;、位置数据&#xff08;…

jenkins入门3 --执行一个小demo

1、新建视图 视图可以理解为是item的集合&#xff0c;这样可以将item分类。新建视频可以选择加入已有的item 2、新建item 1)输入任务名称、选择一个类型&#xff0c;常用的是第一个freestyle project 2&#xff09;进行item相关配置&#xff0c;general 设置项目名字,描述,参数…

【Vue.js】监听器功能(EventListener)的实际应用【合集】

目录 &#x1f914;在实际开发过程中&#xff0c;我遇到了一个颇为棘手的小问题 &#x1f60b;解决这个小问题 问题出现的原因剖析 解决方法阐述 问题成功解决&#xff01;​ &#x1f4d6;相关知识总结 基本概念 使用方法 实际应用场景 &#x1f914;在实际开发过程中…

【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 一、线性表的基本概念 二、初始化线性表 三、销毁线性表 四、判定是否为空表 五、求线性表的长度 六、输出线性表 七、求线性表中某个数据元素值 八、按元素值查找 九、插入数据元素 十、删除数据元素 测试说明 通关代码 测…

【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 一、根据键盘输入的一组有序数据建立顺序表 二、顺序表的输出 三、二分查找算法 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;实现二分查找的算法。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; …

20250103在Ubuntu20.04.5的Android Studio 2024.2.1.12中跑通Hello World

20250103在Ubuntu20.04.5的Android Studio 2024.2.1.12中跑通Hello World 2025/1/3 14:06 百度&#xff1a;android studio helloworld android studio hello world kotlin helloword kotlin 串口 no run configurations added android studio no run configurations added 1、…

卸载干净 IDEA(图文讲解)

目录 1、卸载 IDEA 程序 2、注册表清理 3、残留清理 1、卸载 IDEA 程序 点击屏幕左下角 Windows 图标 -> 设置-控制面板->intellij idea 勾选第一栏 Delete IntelliJ IDEA 2022.2 caches and local history&#xff0c;表示同时删除 IDEA 本地缓存以及历史。 Delete I…

【HarmonyOS】鸿蒙应用实现屏幕录制详解和源码

【HarmonyOS】鸿蒙应用实现屏幕录制详解和源码 一、前言 官方文档关于屏幕录制的API和示例介绍获取简单和突兀。使用起来会让上手程度变高。所以特意开篇文章&#xff0c;讲解屏幕录制的使用。官方文档参见&#xff1a;使用AVScreenCaptureRecorder录屏写文件(ArkTS) 二、方…

我的创作纪念日——《惊变128天》

我的创作纪念日——《惊变128天》 机缘收获日常成就憧憬 机缘 时光飞逝&#xff0c;转眼间&#xff0c;我已在这条创作之路上走过了 128 天。回顾起 2024 年 8 月 29 日&#xff0c;我满怀忐忑与期待&#xff0c;撰写了第一篇技术博客《讲解LeetCode第1题&#xff1a;两数之和…

stm32第一次烧录或者上电运行卡死问题分析

问题描述 单片机烧录代码&#xff08;刚上电&#xff09;无法立即运行&#xff0c;必须要复位一次或多次才能运行&#xff1b;跟踪调试会进入HardFault_Handler中断。 问题分析 烧录配置如下图&#xff0c;首先排除配置问题那么该问题就比较让人头大了&#xff0c;理论上&am…

YOLOV8训练好的best.pt模型转best.onnx并部署成python可调用

今天这篇博文是学习大佬作品以后&#xff0c;执行我的需求后的总结&#xff0c;做了一些代码调整&#xff0c;就此记录一下&#xff0c;非常感谢大佬提供如此好的输出。 已知yolov8 训练好的模型一般是pt格式&#xff0c;比如best.pt&#xff0c;现在我期望这个模型可以转成可以…