【C++】泛型编程 ① ( 函数模板 | 函数模板概念 | 函数模板意义 | 函数模板定义语法 | 函数模板调用语法 | 显式类型调用 | 自动类型推导 )

文章目录

  • 一、函数模板简介
    • 1、函数模板概念
    • 2、函数模板意义
  • 二、函数模板语法
    • 1、函数模板定义语法
    • 2、函数模板调用语法
  • 三、函数模板代码示例
    • 1、代码示例
    • 2、执行结果
  • 四、函数模板代码示例 - 声明多个泛型的情况
    • 1、代码示例
    • 2、执行结果






一、函数模板简介




1、函数模板概念


在 C++ 语言中 , 泛型编程 的 核心就是 函数模板 和 类模板 ;


函数模板 Function Template 是 C++ 语言 中的 重要特性 ;


函数模板概念 :

建立一个 " 通用函数 " , 不指定该函数的 函数返回值类型 和 函数参数类型 ,

仅使用 " 虚拟类型 " 代表 上述 两种类型 ,

该 " 通用函数 " 就是 " 函数模板 " ;


2、函数模板意义


如果 函数的 函数体 相同的 函数 , 只是 参数类型 不同 ,

这种情况下 , 可以 使用 " 函数模板 " 替代 定义 " 多个函数参数类型不同 且 函数体相同 的函数 " ;

只需要 定义一个 " 函数模板 " , 传入不同类型的参数 , 返回不同类型的结果 ;


调用 函数模板 时 根据传递的 参数类型 来生成对应的具体函数实现 , 根据 实际实参类型 取代 形参的虚拟类型 , 从而实现不同的函数功能 ;


函数模板 可以 提高代码的 复用性 和 灵活性 ;





二、函数模板语法




1、函数模板定义语法


函数模板语法 :

  • ① 定义泛型 : 使用 template 关键字 , 告诉 C++ 编译器 开始使用 泛型编程 , 定义的 T 是泛型类型 ;
template <类型形式参数列表>
template <typename T>
template <typename T, typename T1, typename T2>
template <class T>
template <class T, class T1, class T2>

在 类型形式参数列表 中 , 定义 函数模板 中需要用到的 泛型 , 格式如下 :

typename T, typename T1, typename T2 ...

也可以使用

class T, class T1, class T2...

一般情况下使用的是 前者 ;

  • ② 定义函数模板 : 编写 函数 , 参数的 返回值类型 或 参数类型 , 可以 使用之前使用 template 定义的泛型 进行替换 , 如下示例 :
// 定义函数模板 add
T add(T a, T b) {
	return a + b;
}

2、函数模板调用语法


函数模板调用 分为 两种情况 :

  • 显式类型 调用 ;
  • 自动类型 推导 ;

显式类型 调用 , 需要 在 函数名称 后 的 尖括号内 , 显式说明 泛型类型 ;

此处 T 类型为 int 类型 , 这里在 add 函数名后 , 使用 <int> 说明 泛型类型 ;

	int a = 10, b = 20;
	// 调用函数模板
	// 函数模板 显式类型调用
	int c = add<int>(a, b);

如果 在 使用 template 关键字 声明 泛型时 , 指定了多个泛型 , 可以只使用其中的部分类型 ,

// 使用 template 关键字 
// 告诉 C++ 编译器 开始使用 泛型编程 
// 定义的 T 是泛型类型 
// 声明了多个泛型, 可以只使用其中的部分类型
// 使用函数模板时 , 显式类型调用 必须 显式指定所有 泛型类型 的实际类型
template <typename T, typename X>

使用函数模板时 , 显式类型调用 必须 显式指定所有 泛型类型 的实际类型 ;

虽然只使用了 泛型 T , 没有使用泛型 X , 但是 在 显式类型调用时 , 必须指定所有的类型 ;

	int a = 10, b = 20;
	// 调用函数模板
	// 函数模板 显式类型调用
	int c = add<int, bool>(a, b);

自动类型 推导 : 该用法不常用 , 调用 函数模板 时 , 直接传入参数 , 不 显式声明 泛型类型 , 让 C++ 编译器自动推导泛型类型 ;

	double x = 30.0, y = 40.0;
	// 调用函数模板
	// 函数模板 自动类型推导
	double z = add(x, y);




三、函数模板代码示例




1、代码示例


#include "iostream"
using namespace std; 

// 使用 template 关键字 
// 告诉 C++ 编译器 开始使用 泛型编程 
// 定义的 T 是泛型类型 
template <typename T>

// 定义函数模板 add
T add(T a, T b) {
	return a + b;
}

int main() {

	int a = 10, b = 20;
	// 调用函数模板
	// 函数模板 显式类型调用
	int c = add<int>(a, b);
	cout << "c = " << c << endl;

	double x = 30.0, y = 40.0;
	// 调用函数模板
	// 函数模板 自动类型推导
	double z = add(x, y);
	cout << "z = " << z << endl;
	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

2、执行结果


执行结果 :


c = 30
z = 70
Press any key to continue . . .


在这里插入图片描述





四、函数模板代码示例 - 声明多个泛型的情况




1、代码示例


#include "iostream"
using namespace std; 

// 使用 template 关键字 
// 告诉 C++ 编译器 开始使用 泛型编程 
// 定义的 T 是泛型类型 
// 声明了多个泛型, 可以只使用其中的部分类型
// 使用函数模板时 , 显式类型调用 必须 显式指定所有 泛型类型 的实际类型
template <typename T, typename X>

// 定义函数模板 add
T add(T a, T b) {
	return a + b;
}

int main() {

	int a = 10, b = 20;
	// 调用函数模板
	// 函数模板 显式类型调用
	int c = add<int, double>(a, b);
	cout << "c = " << c << endl;

	double x = 30.0, y = 40.0;
	// 调用函数模板
	// 函数模板 自动类型推导
	double z = add<int, double>(x, y);
	cout << "z = " << z << endl;
	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

2、执行结果


执行结果 :


c = 30
z = 70
Press any key to continue . . .


在这里插入图片描述

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

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

相关文章

63基于matlab的生物地理的优化器(BBO)被用作多层感知器(MLP)的训练器。

基于matlab的生物地理的优化器&#xff08;BBO&#xff09;被用作多层感知器&#xff08;MLP&#xff09;的训练器。粒子群优化&#xff08;PSO&#xff09;、蚁群优化&#xff08;ACO&#xff09;、遗传算法&#xff08;GA&#xff09;、进化策略&#xff08;ES&#xff09;和…

企业电子招投标采购系统源码之电子招投标的组成

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…

MySQL集群高可用架构之MHA

目录 一、概念&#xff1a; 1、MHA的工作流程&#xff1a; 2、MHA工作原理&#xff1a; 二、MHA实验&#xff1a; 一、概念&#xff1a; MHA&#xff1a;masterhight availabulity&#xff1a;基于主库的高可用环境下&#xff0c;实现主从复制以及故障切换 主从的架构&…

1688往微信小程序自营商城铺货商品采集API接口

一、背景介绍 随着移动互联网的快速发展&#xff0c;微信小程序作为一种新型的电商形态&#xff0c;正逐渐成为广大商家拓展销售渠道、提升品牌影响力的重要平台。然而&#xff0c;对于许多传统企业而言&#xff0c;如何将商品信息快速、准确地铺货到微信小程序自营商城是一个…

如何修复msvcr120.dll丢失问题,常用的5个解决方法分享

电脑在启动某个软件时&#xff0c;出现了一个错误提示&#xff0c;显示“msvcr120.dll丢失&#xff0c;无法启动软件”。这个错误通常意味着计算机上缺少了一个重要的动态链接库文件&#xff0c;即msvcr120.dll。 msvcr120.dll是什么 msvcr120.dll是Microsoft Visual C Redist…

文章发表 | 求臻医学发布精准肿瘤学临床试验预筛选平台

近日&#xff0c;求臻医学信息与人工智能团队研发的精准肿瘤学临床试验预筛选平台OncoCTMiner&#xff0c;在线发表于国际期刊Database: The Journal of Biological Databases and Curation (IF5.8)。OncoCTMiner集成自然语言处理&#xff08;NLP&#xff09;和大型语言模型&am…

Enfocus PitStop Pro 2022

Enfocus PitStop Pro是一款专为PDF编辑和优化而设计的软件&#xff0c;旨在帮助用户高效、准确地处理PDF文件。其功能包括但不限于&#xff1a; 全面的PDF编辑功能&#xff1a;包括添加、删除或重新排列页面&#xff0c;合并和分割PDF文件&#xff0c;以及调整页面大小和方向等…

Linux 函数库

函数库&#xff1a; 我们的C程序中&#xff0c;并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢? 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去…

人工智能基础_机器学习032_多项式回归升维_原理理解---人工智能工作笔记0072

现在开始我们来看多项式回归,首先理解多维 原来我们学习的使用线性回归,其实就是一条直线对吧,那个是一维的,我们之前学的全部都是一维的对吧,是一维的,然后是多远的,因为有多个x1,x2,x3,x4... 但是比如我们有一个数据集,是上面这种,的如果用一条直线很难拟合,那么 这个时候,…

美国受教育程度最高的五大城市

许多研究表明&#xff0c;高等教育水平对一个城市的经济发展可起到决定性的作用。美国最繁荣、经济最活跃的地区无一例外都是拥有本科和研究生学位居民的集中地。本篇知识人网小编就为大家介绍美国受教育程度最高的五大城市。 本文根据主页菌在“Stoooges三士渡”刊载的文章整理…

通过cpolar实现外网ssh远程连接linux

现在我有个想法&#xff0c;就是希望通过外网能够远程连接到我的开发板。这里我们就需要使用到一种技术&#xff0c;内网穿透。 内网穿透是一种将内部网络中的设备通过外网进行访问的技术。在linux系统中&#xff0c;实现内网穿透有多种方式&#xff0c;其中最常见的方法是使用…

Postman还能做Mock?又学了一招!

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

A Gentle Introduction to Graph Neural Networks

A Gentle Introduction to Graph Neural Networks----《图神经网络入门》 图神经网络信息传递积累 图在我们身边随处可见&#xff0c;现实世界中的物体通常是根据它们与其他事物的联系来定义的。一组物体以及它们之间的联系可以很自然地用图来表示。十多年来&#xff0c;研究人…

AWS实战(一)-创建S3 存储桶

1&#xff09;登录AWS账号&#xff0c;选择服务—>存储—>S3。 2&#xff09;查看存储桶列表 3&#xff09;点击"创建存储桶"创建bucket。 4&#xff09;设置跨域 点击编辑&#xff0c;修改跨域设置即可。

工具: PowerShell常用命令

ISE: 打开ISE编辑器 echo: 输出一行信息 mkdir: 创建一个文件夹 mkdir ./MyPlugin文件相关处理 参考&#xff1a; powershell新手向&#xff0c;新建、删除文件及对文件添加内容 参考文档 PowerShell入门教程 语法、环境| Powershell 教程

【springmvc框架一文搞定】

SpringMVC框架 1. 搭建springmvc测试项目1.1 创建maven项目1.2 导入依赖pom.xml1.3 将springmvc容器加载到tomcat中1.4 启动tomcat插件1.5 访问路径&#xff1a; 2. 剖析启动过程2.1 启动服务器初始化过程2.2 访问路径执行过程 3.spring-springmvc bean的管理3.1 因为功能不同&…

langchain实战-hello world

一、LangChain简介 github地址&#xff1a; GitHub - langchain-ai/langchain: ⚡ Building applications with LLMs through composability ⚡ LangChain是一个用于开发由语言模型支持的应用程序的框架。它使应用程序能够&#xff1a; 具有上下文感知能力&#xff1a;将语言模…

BES2700H开发不完全手册

BES2700H开发不完全手册 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;可加我微信hezkz17, 本群提供音频技术答疑服务&#xff0c;群赠送语音信号处理降噪算法&#xff0c;ANC AEC ENC EQ BF BES蓝牙耳机音频资料 1 成功编译 2 代码 3 开放文档

餐饮业数字化革命:抖音小程序团购功能的开发与优化

本文将聚焦于餐饮业数字化的前沿&#xff0c;着眼于抖音小程序团购功能的开发与优化&#xff0c;探讨如何借助这一功能实现餐饮业的蓬勃发展。 一、数字化浪潮下的餐饮业 传统餐饮业面临的挑战在于如何更好地适应快节奏生活和消费者多元化需求。数字化浪潮为餐饮业提供了解决方…