C++ 泛型编程:函数模板

news2025/1/11 15:01:55

文章目录

  • 前言
  • 一、什么是泛型编程
  • 二、函数模板
  • 三、函数模板的使用
  • 四、多参数函数模板
  • 五,示例代码:
  • 总结

前言

当需要编写通用的代码以处理不同类型的数据时,C++ 中的函数模板是一个很有用的工具。函数模板允许我们编写一个通用的函数定义,可以用于多种不同的数据类型,从而提高代码的重用性和灵活性。


一、什么是泛型编程

泛型编程 是一种编程范式,旨在实现可重用、通用性高的代码。它允许我们编写与特定数据类型无关的代码,使代码能够适用于多种不同的数据类型。

  1. 传统的编程 方法主要依赖于特定的数据类型,需要为每个数据类型编写特定的代码。
  2. 泛型编程中,我们使用泛型类型来表示不特定的数据类型,可以在代码中使用泛型类型作为参数、变量或返回类型。使用泛型类型,我们可以编写通用的算法和数据结构,使其能够适用于不同的数据类型。

泛型编程的核心概念是模板。模板是一种代码生成机制,可以根据具体的数据类型生成对应的代码。C++中的模板可以是函数模板或类模板。函数模板允许我们定义通用的函数,而类模板允许我们定义通用的类。

二、函数模板

  1. 函数模板 概念:
  • 一种特殊的函数 可用不同类型去调用。
  • 看起来喝普通的函数相似,区别是类型可被参数化
  1. 函数模板规则:
    template 关键字用于声明开始进行泛型编程
    typename 关键字用于声明泛指类型.
    T 是泛指任意的数据类型。

下面是一个 用于交换 数据的函数模板。
在这里插入图片描述

三、函数模板的使用

  • 自动类型推导调用。
    自动推导类型时,必须严格匹配。
int a = 1;
int b = 2;

Swap(a, b);					// 自动推导
  • 具体类型显示调用。
    显示类型指定时,能够进行隐式类型转化。
    显式指定函数模板的参数类型,而不是依赖编译器的类型推导。这可以通过在函数调用中使用尖括号来实现.
float c = 2.1;
float d = 3.1;

Swap<float>(c, d);				// 显示调用

四、多参数函数模板

多参数函数模板 就是 函数模板定义任意多个不同的参数类型。

对于多参数模板, 无法自动推导返回值的类型。可以从左到右 部分指定类型参数。
工程中 将第一个类型参数 作为 返回值参数类型。
在这里插入图片描述
例如:计算 a ,b 之和。

using namespace std;

template <typename T1, typename T2, typename  T3>
T1 Add(T2 a, T3 b)
{
	return static_cast<T1>(a+b);
}

int main(void)
{
	// T1 = int, T2 = double, T3 = double
	int r1 = Add<int>(0.6, 0.7);						// 第一个参数类型 作为 返回值类型,从左往右推
    
    // T1 = double, T2 = float, T3 = double
	double r2 = Add<double, float>(0.6, 0.7);
	
	// T1 = float, T2 = float, T3 = float
	float r3 = Add<float, float, float>(0.6, 0.7);

	cout << "r1 = " << r1 << endl;
	cout << "r2 = " << r2 << endl;
	cout << "r3 = " << r3 << endl;

	return 0;
}

在这里插入图片描述
注意
当 函数模板遇到了 普通函数,C++ 编译器优先选择 普通函数。如果函数模板可以产生更厚的匹配,则选择模板。可以通过 < > 限定编译器只匹配模板。

五,示例代码:

通过下面的例子进一步讲解:
使用 函数模板 分别对整形数组 和 字符串数组 进行排序 打印。

using namespace std;

template <typename T>						// 函数模板:交换数据
void Swap(T& a, T& b)
{
	T c = a;
	a = b;
	b = c;
}

template<typename T>
void Sort(T a[], int len)					// 函数模板:数组元素排序
{
	for (int i = 0; i < len; i++)
	{
		for (int j = i; j < len; j++)
		{
			if (a[i] > a[j])
				Swap(a[i],a[j]);
		}
	}
}

int main(void)
{
	int a[5] = {3,5,1,2,4};
	for (int i = 0; i < 5; i++)
		cout << a[i] << ",";
	cout << endl;

	Sort(a,5);											// 数组元素排序
	for (int j = 0; j < 5; j++)
		cout << a[j] << ",";
	cout << endl;

	string s[5] = { "Java", "C++", "Pascal", "Ruby", "Basic" };
	for (int k = 0; k < 5; k++)
		cout << s[k] << ",";
	cout << endl;

	Sort(s, 5);											// 字符串 数组排序
	for (int n = 0;n < 5;n++)
		cout << s[n] << ",";
	cout << endl;

	return 0;
}

在这里插入图片描述


总结

以上是对C++函数模板的详细解析。函数模板提供了一种强大的机制,可以编写与数据类型无关的通用代码,从而提高代码的重用性和灵活性,以及更好地支持泛型编程。

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

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

相关文章

php从静态资源到动态内容

1、从HTML到PHP demo.php:后缀由html直接改为php,实际上当前页面已经变成了动态的php应用程序脚本 demo.php: 允许通过<?php ... ?>标签,添加php代码到当前脚本中 php标签内部代码由php.exe解释, php标签之外的代码原样输出,仍由web服务器解析 <!DOCTYPE html>…

Qt中将信号封装在一个继承类中的方法

QLabel标签类对应的信号如下&#xff1a; Qt中标签是没有双击&#xff08;double Click&#xff09;这个信号的&#xff1b; 需求一&#xff1a;若想双击标签使其能够改变标签中文字的内容&#xff0c;那么就需要自定义一个“双击”信号&#xff0c;并将其封装在QLabel类的派生…

使用vscode写vue文件代码有时不提示

背景&#xff1a; 安装了volar插件&#xff0c;但是在vue文件中导入js文件代码不提示&#xff0c;准确来说是有时提示有时不提示 解决方案&#xff1a; 插件冲突&#xff0c;卸载 JavaScript (ES6) code snippets 插件&#xff0c;这个插件在vue文件中适配不是很好。 很有可能…

【正版系统】2023热门短剧SAAS版开源 | 小程序+APP+公众号H5

当我们在刷百度、D音、K手等各种新闻或短视频时经常会刷到剧情很有吸引力的短剧广告&#xff0c;我们点击广告链接即可进入短剧小程序&#xff0c;小程序运营者通过先免费看几集为诱耳然后在情节高潮时弹出充值或开VIP会员才能继续看的模式来赚钱&#xff0c;以超级赘婿、乡村小…

电影数据可视化综合分析

数据可视化&分析实战 1.1 沈腾参演电影数据获取 1.2 电影数据可视化分析 目录 数据可视化&分析实战前言1. 数据认知2. 数据可视化2.1 解决matplotlib不能绘制中文字符的问题2.2 折线图2.3 柱状图绘制2.4 箱线图绘制2.5 饼图 3. Na值处理及相关性分析3.1 相关性分析3.2…

2023.08.13 学习周报

文章目录 摘要文献阅读1.题目2.要点3.问题4.解决方案5.本文贡献6.方法6.1 特征选择6.2 时间序列平稳性检测与数据分解6.3 基于GRU神经网络的PM2.5浓度预测 7.实验7.1 网络参数7.2 实验结果7.3 对比实验 8.讨论9.结论10.展望 PINNS模型1.自动微分2.全连接神经网络3.PINNs模型的P…

NavMeshPlus 2D寻路插件

插件地址:h8man/NavMeshPlus&#xff1a; Unity NavMesh 2D Pathfinding (github.com) 我对Unity官方是深恶痛觉,一个2D寻路至今都没想解决,这破引擎早点倒闭算了. 这插件是githun的开源项目,我本身是有写jps寻路的,但是无法解决多个单位互相阻挡的问题(可以解决但是有性能问…

Yolov5(一)VOC划分数据集、VOC转YOLO数据集

代码使用方法注意修改一下路径、验证集比例、类别名称&#xff0c;其他均不需要改动&#xff0c;自动划分训练集、验证集、建好全部文件夹、一键自动生成Yolo格式数据集在当前目录下&#xff0c;大家可以直接修改相应的配置文件进行训练。 目录 使用方法&#xff1a; 全部代码…

Window停止更新操作

在这里插入图片描述

Android平台RTMP推送或GB28181设备接入端如何实现采集audio音量放大?

我们在做Android平台RTMP推送和GB28181设备对接的时候&#xff0c;遇到这样的问题&#xff0c;有的设备&#xff0c;麦克风采集出来的audio&#xff0c;音量过高或过低&#xff0c;特别是有些设备&#xff0c;采集到的麦克风声音过低&#xff0c;导致播放端听不清前端采集的aud…

1216. 验证回文字符串 III;764. 最大加号标志;1135. 最低成本联通所有城市

1216. 验证回文字符串 III 核心思想&#xff1a;动态规划&#xff0c;这题需要一个思路的转换&#xff0c;删除最多k个字符判断是否为回文串&#xff0c;就相当于问你子序列中最长的回文串的长度是否比n-k长,就将这题转换为了最长回文子序列。 764. 最大加号标志 核心思想&am…

前后端分离------后端创建笔记(03)前后端对接(下)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

Shader 编程:三角形、矩形等多边形绘制

该原创文章首发于微信公众号&#xff1a;字节流动 未经作者&#xff08;微信ID&#xff1a;Byte-Flow&#xff09;允许&#xff0c;禁止转载 SDF 有向距离场 上节其实牵扯到 SDF 算法&#xff0c;因为后面涉及高级特效的时候会经常用到&#xff0c;这里先提前对它做个简单的介…

注意:阿里云服务器随机分配可用区说明

阿里云服务器如有ICP备案需求请勿选择随机可用区&#xff0c;因为当前地域下的可用区可能不支持备案&#xff0c;阿里云百科分享提醒大家&#xff0c;如果你的购买的云服务器搭建网站应用&#xff0c;网站域名需要使用这台云服务器备案的话&#xff0c;不要随机分配可用区&…

从源码分析常见集合的区别之List接口

说到Java集合&#xff0c;共有两大类分别是Collection和Map。今天就详细聊聊大家耳熟能详的List吧。 List接口实现自Collection接口&#xff0c;是Java的集合框架中的一员&#xff0c;List接口下又有ArrayList、LinkedList和线程安全的Vector&#xff0c;今天就简单分析一下Ar…

力扣刷题(C++)知识点

一&#xff0c;找到数组的中间位置 这个是错的&#xff0c;不能分开来 C vector<int>& nums 用法 创建一维数组vector&#xff1a; vector<int> nums; //不指定长度vector<int> nums(n); //指定长度为n c &#xff1c;numeric&#xff1e; accumul…

VM327:38 Uncaught ReferenceError: boay is not defined

找了好久的错误&#xff0c;查找的时候都是路径错了&#xff0c;或者少符号了&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;但是就是不是&#xff0c;这个错误就很明显&#xff0c;但是人一般对自己的代码真的很自信的&#xff01;&#xff01;&#xff01; 最…

自动化安装系统—PXE(一)

系统安装过程 加载boot loader加载启动安装菜单加载内核和initrd文件加载根系统运行anaconda的安装向导 安装光盘中与安装相关的文件 安装autofs启动后会自动出现/misc目录。 在虚拟机设置中添加CD/DVD&#xff0c;使用系统ISO文件&#xff0c;登录系统后mount /dev/cdrom …

解决lldb调试时可能出现的personality set failed: Function not implemented

最近在尝试使用Visual Studio 2022远程连接Linux进行C/C的开发&#xff0c;由于CentOS风波不断&#xff0c;所以现在的开发基本上都是使用ubuntu了&#xff0c;但是目前VS2022有一些BUG&#xff0c;就是远程调试时&#xff0c;如果目标系统是ubuntu则会出现启动调试器很慢的问题…

【Linux】线程同步和死锁

目录 死锁 什么是死锁 构成死锁的四个必要条件 如何避免死锁 线程同步 同步的引入 同步的方式 条件变量 条件变量的使用 整体代码 死锁 什么是死锁 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所占用不会释放 的资源而处…