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

文章目录

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

前言

当需要编写通用的代码以处理不同类型的数据时,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 = doubleint r1 = Add<int>(0.6, 0.7);						// 第一个参数类型 作为 返回值类型,从左往右推// T1 = double, T2 = float, T3 = doubledouble r2 = Add<double, float>(0.6, 0.7);// T1 = float, T2 = float, T3 = floatfloat 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.mzph.cn/news/34983.shtml

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

相关文章

接口测试之Jmeter+Ant+Jenkins接口自动化测试平台

平台简介 一个完整的接口自动化测试平台需要支持接口的自动执行&#xff0c;自动生成测试报告&#xff0c;以及持续集成。Jmeter支持接口的测试&#xff0c;Ant支持自动构建&#xff0c;而Jenkins支持持续集成&#xff0c;所以三者组合在一起可以构成一个功能完善的接口自动化…

idea - 刷新 Git 分支数据 / 命令刷新 Git 分支数据

一、idea - 刷新 Git 分支数据 idea 找到 fetch 选项&#xff0c;重新获取分支数据 二、命令刷新 Git 分支数据 git fetch参考链接 1. 远程Gitlab新建的分支在IDEA里不显示

jxls导出问题

![请添加图片描述](https://img-blog.csdnimg.cn/bc74c4207818491c93b75e19b3333451.png 为什么最后导出的文件还是按原样导出啊&#xff0c;没有填充数据 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d4500b9a98c042f6b64a5d0650071303.png

ChatGPT等人工智能编写文章的内容今后将成为常态

BuzzFeed股价上涨200%可能标志着“转向人工智能”媒体趋势的开始。 周四&#xff0c;一份内部备忘录被华尔街日报透露BuzzFeed正计划使用ChatGPT聊天机器人-风格文本合成技术来自OpenAI&#xff0c;用于创建个性化盘问和将来可能的其他内容。消息传出后&#xff0c;BuzzFeed的…

文本三剑客之grep命令和awk命令 1.0 版本

grep awk 1.grep命令1.1 基本格式1.2 常用选项 2.awk命令2.1 awk工作原理2.2 awk命令格式2.3 awk常用内置变量 1.grep命令 1.1 基本格式 grep [选项]… 查找条件 目标文件1.2 常用选项 选项功能 -m [ x ]匹配x次 后停止,x为具体数字-v取反 -i忽略字符大小写 -n显示匹配的 …

Dynamic CRM开发 - 实体介绍

实体简介 在CRM中,实体(Entity)是数据的基本载体,也是构建业务逻辑网络的基础节点。 实体可以理解为数据库中的一张表(实体中的字段对应数据库表的字段),比如创建一个实体存储客户信息,创建一个实体存储产品信息,产品实体里可以创建一个查找类型的字段(类似表的外键)…

【三维编辑】Seal-3D:基于NeRF的交互式像素级编辑

文章目录 摘要一、引言二、方法2.1.基于nerf的编辑问题概述2.2.编辑指导生成2.3.即时预览的两阶段学生训练 三、实验四、代码总结 项目主页: https://windingwind.github.io/seal-3d/ 代码&#xff1a;https://github.com/windingwind/seal-3d/ 论文: https://arxiv.org/pdf/23…

阿里云轻量应用服务器_2核4G4M_2核2G3M_性能测评

阿里云轻量应用服务器2核2G3M带宽108元一年&#xff0c;系统盘为50GB高效云盘&#xff1b;轻量服务器2核4G4M带宽&#xff0c;60GB高效云盘297.98元12个月。目前轻量应用服务器只有2核2G和2核4G有活动&#xff0c;阿里云百科分享阿里云轻量应用服务器入口&#xff1a; 目录 阿…

【Qt高阶】老Qt都不一定清楚的“QObject线程亲和性”【2023.08.13】

老Qt都不一定清楚的“线程亲和性” 与题目无关 感觉自己还挺2&#xff0c;有粉丝点了那个契约者会给up发个鼓励的话&#xff0c;我还以为是人私信发的&#xff0c;都挨个感谢了&#xff0c;后来才意识到是系统自动发的&#x1f623;&#x1f623;&#x1f623;。 自上上期视频对…

Three.js阴影

目录 Three.js入门 Three.js光源 Three.js阴影 Three.js纹理贴图 使用灯光后&#xff0c;场景中就会产生阴影。物体的背面确实在黑暗中&#xff0c;这称为核心阴影&#xff08;core shadow&#xff09;。我们缺少的是落下的阴影&#xff08;drop shadow&#xff09;&#…

【数据结构】——栈、队列的相关习题

目录 题型一&#xff08;栈与队列的基本概念&#xff09;题型二&#xff08;栈与队列的综合&#xff09;题型三&#xff08;循环队列的判空与判满&#xff09;题型四&#xff08;循环链表表示队列&#xff09;题型五&#xff08;循环队列的存储&#xff09;题型六&#xff08;循…

一文揭秘饿了么跨端技术的演进、实践与落地

跨端技术背景与演进历程 跨端&#xff0c;究竟跨的是哪些端&#xff1f; 自 90 年的万维网出现&#xff0c;而后的三十多年&#xff0c;我们依次经历了 PC 时代、移动时代&#xff0c;以及现在的万物互联&#xff08;的 IoT &#xff09;时代&#xff0c;繁荣的背后&#xff…

【Apollo】Apollo-ros版本架构学习与源码分析

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Apollo-ros版本架构学习与源码分析。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&a…

解决GitHub的速度很慢的几种方式

1. GitHub 镜像访问 这里提供两个最常用的镜像地址&#xff1a; https://hub.njuu.cf/search https://www.gitclone.com/gogs/search/clonesearch 也就是说上面的镜像就是一个克隆版的 GitHub&#xff0c;你可以访问上面的镜像网站&#xff0c;网站的内容跟 GitHub 是完整同步…

期权定价模型系列【4】—期权组合的Delta-Gamma-Vega中性

期权组合的Delta-Gamma-Vega中性 期权组合构建时往往会进行delta中性对冲&#xff0c;在进行中性对冲后&#xff0c;期权组合的delta敞口为0&#xff0c;此时期权组合仍然存在gamma与vega敞口。因此研究期权组合的delta-gamma-vega敞口中性是有必要的。 本文旨在对delta-gamma-…

关于新手学习STM32开发应该如何入门?

对于新手来说&#xff0c;学习STM32开发可能会感到困惑&#xff0c;尤其是在拿到开发板后该如何入门。在这里有嵌入式学习路线&#xff0c;毕设&#xff0c;各种项目&#xff0c;需要留个6。以下是部分内容概述&#xff1a;硬件介绍&#xff1a;了解STM32开发板的基本硬件组成和…

如何让你的图片服务也有类似OSS的图片处理功能

原文链接 前言 有自己机房的公司一般都有一套存储系统用于存储公司的图片、视频、音频、文件等数据&#xff0c;常见的存储系统有以NAS、FASTDFS为代表的传统文件存储&#xff0c;和以Minio为代表的对象存储系统&#xff0c;随着云服务的兴起很多公司逐渐将数据迁移到以阿里云…

企业有VR全景拍摄的需求吗?能带来哪些好处?

在传统图文和平面视频逐渐疲软的当下&#xff0c;企业商家如何做才能让远在千里之外的客户更深入、更直接的详细了解企业品牌和实力呢&#xff1f;千篇一律的纸质材料已经过时了&#xff0c;即使制作的再精美&#xff0c;大家也会审美疲劳&#xff1b;但是你让客户远隔千里&…

(MySQL经验)之MySQL单表行数最好低于2000w

作为在后端开发&#xff0c;是不是经常听到过&#xff0c;mysql 单表最好不要超过 2000w,单表超过 2000w 就要考虑数据迁移了&#xff0c;表数据都要到 2000w &#xff0c;查询速度变得贼慢。 1、建表操作 建一张表 CREATE TABLE person( id int NOT NULL AUTO_INCREMENT PRI…

如何让ES低成本、高性能?滴滴落地ZSTD压缩算法的实践分享

前文分别介绍了滴滴自研的ES强一致性多活是如何实现的、以及如何提升ES的性能潜力。由于滴滴ES日志场景每天写入量在5PB-10PB量级&#xff0c;写入压力和业务成本压力大&#xff0c;为了提升ES的写入性能&#xff0c;我们让ES支持ZSTD压缩算法&#xff0c;本篇文章详细展开滴滴…