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,一经查实,立即删除!

相关文章

Vue day02 Computed和Watch

1.事件绑定 可以用 v-on 指令监听DOM 事件&#xff0c;并在触发时运行一些 JavaScript 代码。v-on 还可以接收一个需要调用的方法名称。 <button v-on:click"handler">good</button> methods: { handler: function (event) { if (event) { alert(event.t…

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

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

BOLT- 识别和优化热门的基本块

在BOLT中&#xff0c;识别和优化热门的基本块之所以关键&#xff0c;是因为BOLT的主要目标是优化程序以更好地利用硬件特性&#xff0c;特别是指令缓存&#xff08;ICache&#xff09;。以下是BOLT如何识别和优化热门基本块的流程&#xff1a; 收集性能数据: BOLT开始的时候并不…

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

qt多线程使用方式

有5个方式&#xff1a;可以参考这个博客&#xff1a;Qt 中开启线程的五种方式_qt 线程_lucky-billy的博客-CSDN博客 注&#xff1a;为了实现更加灵活的线程管理&#xff08;因为这5种都有一些不方便之处&#xff1a;QThread需要子类化且不能传参&#xff0c;moveToThread不能传…

【leetcode】459. 重复的子字符串(easy)

给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: s “aba” 输出: false 示例 3: 输入: s “abcabcabcabc” 输出: true 解释: 可由子串 “ab…

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

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

ubuntu 20.04 RK3568网络的优先级设置

1、背景 硬件使用RK3568 CPU&#xff0c;操作系统采用ubuntu 20.04 Lxqt桌面的版本。硬件上具有一个有线以太网卡&#xff0c;一个wifi网卡&#xff0c;一个5G网卡。由于操作系统默认的网络优先级为有线网卡的最高&#xff0c;5G网卡次之。在一个业务应用中需要5G网卡的连接外…

文本三剑客之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)是数据的基本载体,也是构建业务逻辑网络的基础节点。 实体可以理解为数据库中的一张表(实体中的字段对应数据库表的字段),比如创建一个实体存储客户信息,创建一个实体存储产品信息,产品实体里可以创建一个查找类型的字段(类似表的外键)…

【Express.js】集成RabbitMQ

集成RabbitMQ 本节我们介绍在 express.js 中集成 rabbitmq. RabbitMQ 是一个消息队列中间件&#xff0c;常用于请求削峰&#xff0c;事务的队列处理&#xff0c;事件订阅机制的实现等。 准备工作 创建一个 express.js 项目&#xff08;本文基于evp-express-cli&#xff09;…

【三维编辑】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…

创建一个Spring Boot项目

安装所需软件&#xff1a;首先确保你的计算机上已经安装了Java JDK和Maven构建工具。你可以从官方网站下载并按照说明进行安装。 创建一个新的Spring Boot项目&#xff1a;在命令行或终端中使用Maven命令创建一个新的Spring Boot项目。执行以下命令&#xff1a;mvn archetype:…

阿里云轻量应用服务器_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…