c++函数模板

c++函数模板

一.函数模板

1.关于模板的使用

template:定义模板的关键字

typename:定义模板类型的关键字

T 通用的类型标识符

使用如下

template<typename T> //这样就写了一个模板

2.模板函数的作用

普通函数

int fun(int a, int b) {return a + b;
}

这个函数只能进行一种类型的加和

模板函数

template<typename T>
T fun(T a, T b) {return a + b;
}

模板函数,在调用函数时,模板类型可以通过实参自动推导(前提:在形参中用到了模板类型),这样就可以进行不同种类型的加和

3.确定函数模板类型的三种方式

1.显示指定

template<typename T>//T为int类型
void fun() {T b=0;cout << typeid(b).name() << endl;
}int main(){fun<int>();//显示指定为int类型return 0;
}

2.实参自动推导

template<typename T>//T为long类型
void fun(T b) {cout << typeid(b).name() << endl;
}int main(){long a=10;fun(a);//实参自动推导为long类型return 0;
}

3.默认的模板类型

template<typename T = long>//默认的模板类型T为long类型
void fun(T b) {cout << typeid(b).name() << endl;
}

注意:这三种确定函数模板类型的方式有优先级关系为 显示指定>实参自动推导>默认的模板类型

如下代码

template<typename T = long>//T最终类型为char类型
void fun(T b) {cout << typeid(b).name() << endl;
}int main(){int a=10;fun<char>(a);return 0;
}

4.模板的参数列表

1.函数模板的参数列表默认值不需要从右到左依次赋值

代码如下

template<typename M=char, typename T, typename K>//不会出现报错

2.函数模板参数列表比较好的顺序

前面:必须要显示指定的

中间:默认类型

最后:实参推导

代码如下

template<typename M, typename K=char, typename T >
void fun(T t) {T t1 = 0;K k = 0;M m = 0;//typeid(T).name() 这个是输出T的类型是什么cout << typeid(T).name() << endl;//输出为doublecout << typeid(K).name() << endl;//输出为charcout << typeid(M).name() << endl;//输出为long
}
int main(){fun<long>(1.1);	return 0;
}

5.模板函数的实例化

1.模板函数会按需实例化出具体的函数

例如

template<typename T>
void fun(T b);//模板函数声明和定义可以分开写,但模板声明和定义都要写,这里是函数的声明int main(){fun(1.1);//这里会实例化出一个函数记为 函数1 下面展示	fun(1);//这里会实例化出一个函数记为 函数2 下面展示	return 0;
}template<typename T>//模板函数定义
void fun(T b) {cout << typeid(T).name() << endl;
}
//函数1
void fun<>(double b) {cout << typeid(double).name() << endl;
}
//函数2
void fun<>(int b) {cout << typeid(int).name() << endl;
}

2…模板函数的实例化是在编译单元文件内(源文件内),按需实例化(实例化是在编译期确定的)

注意:模板函数,声明和定义,应当(不是必须,也可以分开)放在一起

二.用函数模板优化冒泡排序(使之能给不同类型的数据排序)

未优化前

#include <iostream>
using namespace std;void BubbleSort(int parr[], int len) {for (int i = 0; i < len - 1; i++) {for (int j = 0; j < len - i - 1; j++) {if (parr[j]<parr[j+1]) {int temp;temp = parr[j];parr[j] = parr[j + 1];parr[j + 1] = temp;}}}
} int main() {int arr[] = { 1,5,64,7,2,6,1,4,5 };BubbleSort(arr, 9);for (int v : arr) {cout << v << "   ";}return 0;
}

优化后

#include <iostream>
using namespace std;template<typename T>
bool rule_up(T t1,T t2) {//升序return t1 > t2;
}template<typename T>
bool rule_down(T t1, T t2) {//降序return t1 < t2;
}
template<typename T> 
void BubbleSort(T parr[], int len,bool(*P_FUN)(T,T)) {//第三个参数是判断升序还是降序的for (int i = 0; i < len - 1; i++) {//进行排序for (int j = 0; j < len - i - 1; j++) {if ((*P_FUN)(parr[j],parr[j+1])) {//判断是否交换T temp;temp = parr[j];parr[j] = parr[j + 1];parr[j + 1] = temp;}}}
} int main() {//样例测试int arr[] = { 1,5,64,7,2,6,1,4,5 };BubbleSort(arr, 9,&rule_up);for (int v : arr) {cout << v << "   ";}cout << endl;double arr2[] = {1.5,5.9,7.8,1.8,1.9,7.8,4.5 };BubbleSort(arr2, 7,&rule_down);for (double v : arr2) {cout << v << "   ";}return 0;
}

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

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

相关文章

452. 用最少数量的箭引爆气球

452. 用最少数量的箭引爆气球452. 用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可…

【Linux】Linux下git的使用

文章目录 一、什么是git二、git发展史三、Gitee仓库的创建1.新建仓库2.复制仓库链接3.在命令行克隆仓库3.1仓库里的.gitignore是什么3.2仓库里的git是什么 三、git的基本使用1.将克隆仓库的新增文件添加到暂存区(本地仓库)2.将暂存区的文件添加到.git仓库中3.将.git仓库中的变化…

中介者模式——协调多个对象之间的交互

1、简介 1.1、概述 如果在一个系统中对象之间的联系呈现为网状结构&#xff0c;如下图所示&#xff1a; 对象之间存在大量的多对多联系&#xff0c;将导致系统非常复杂&#xff0c;这些对象既会影响别的对象&#xff0c;也会被别的对象所影响&#xff0c;这些对象称为同事对…

深入了解 PostgreSQL 扩展插件

深入了解 PostgreSQL 扩展插件 在 PostgreSQL 数据库中&#xff0c;扩展插件是极具价值的工具&#xff0c;它们为我们提供了丰富多样的功能增强。本篇博客将深入介绍几个常用的 PostgreSQL 扩展插件&#xff0c;包括 pg_stat_statements、uuid、postgis 以及 postgis_raster。…

【JS代码调试技巧】你必须知道的Javascript技巧汇总

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录 使用控制台检查变量值控制台使用 type of 检查变量的类型捕获拼错的变量名和函数名捕获使用赋值运算符而不是相等运算符捕捉函数调用后缺少的左括号和右括号 &#x1f338;I could be bounded in a nutshel…

使用FreeMarker导出word文档(支持导出图片)

今天跟大家分享一下工作中比较实用的导出word 带图片的功能。 对于在idea开发中我们需要引入以下依赖&#xff1a; 2.对于eclipse 开发我们需要进入对应的jar包 这个必须放在lib下&#xff0c;同样也需要在当前项目的环境是加入该依赖 需要在MEAT-INF加入 首先制定word 导出…

ORACLE-DG总结

述 当主库的某些日志没有成功传送到备库,那么这时候就发生了归档裂缝(Archive Gap)。目前Oracle提供了两种日志GAP的检测和处理机制,分别是自动GAP处理(Automatic Gap Resolution)和FAL进程GAP处理(FAL Gap Resolution)。自动GAP处理即主库上的ARCn进程会每分钟检查备库…

如何隐藏开源流媒体EasyPlayer.js视频H.265播放器的实时录像按钮?

目前我们TSINGSEE青犀视频所有的视频监控平台&#xff0c;集成的都是EasyPlayer.js版播放器&#xff0c;它属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;包括WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#x…

Windows安装JDK和JRE的方法

原文网址&#xff1a;Windows安装JDK和JRE的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Windows安装JDK和JRE&#xff08;Java8&#xff09;的方法。 下载 下载入口&#xff1a;https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html jdk-8…

计算机网络(2) --- 网络套接字UDP

计算机网络&#xff08;1&#xff09; --- 网络介绍_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131967378?spm1001.2014.3001.5501 目录 1.端口号 2.TCP与UDP协议 1.TCP协议介绍 1.TCP协议 2.UDP协议 3.理解 2.网络字节序 发送逻辑…

Ansible之playbook剧本编写

一、playbook的相关知识 1.playbook简介 playbook是 一个不同于使用Ansible命令行执行方式的模式&#xff0c;其功能更强大灵活。简单来说&#xff0c;playbook是一个非常简单的配置管理和多主机部署系统&#xff0c;不同于任何已经存在的模式&#xff0c;可作为一个适合部署复…

Azure pipeline自动化打包发布

pipeline自动化&#xff0c;提交代码后&#xff0c;就自动打包&#xff0c;打包成功后自动发布 第一步 pipeline提交代码后&#xff0c;自动打包。 1 在Repos,分支里选择要触发的分支&#xff0c;这里选择cn_china,对该分支设置分支策略 2 在生产验证中增加新的策略 3 在分支安…

基于STM32103移植FreeRTOS

目录 一、FreeRTOS协议栈下载 二、准备工程文件与协议代码 三、移植FreeRTOS协议栈 一、FreeRTOS协议栈下载 1、官网下载 FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensionshttps://www.freertos.or…

基于php雪花算法工具类Snowflake -来自chatGPT

<?phpclass Snowflake {// 定义Snowflake算法的各个参数private $workerIdBits 5;private $datacenterIdBits 5;private $sequenceBits 12;private $workerIdShift;private $datacenterIdShift;private $timestampLeftShift;private $maxWorkerId;private $maxDatacente…

“Why Should I Trust You?” Explaining the Predictions of Any Classifier阅读笔记

“Why Should I Trust You?” Explaining the Predictions of Any Classifier阅读笔记 1. 论文贡献2. 背景 [ 1 ] ^{[1]} [1]3. LIME解释单个样本3.1 总体思想3.2 构建可解释的数据表示 [ 1 ] ^{[1]} [1]3.3 可解释性和忠实度的权衡3.4 局部采样3.5 稀疏线性解释3.6 使用SVM进…

无人机航测技术有何特点?主要应用在哪些方面?

无人机航测是航空摄影测量的一种&#xff0c;主要面向低空遥感领域&#xff0c;具有成本低、快速高效、适用范围广等特点。目前&#xff0c;无人机航测主要应用于地形测绘、城市数字化建设、工程建设等方面。 无人机航测技术的特点 1、作业成本低 传统的人工测量技术主要利用…

2023 年牛客多校第六场题解

A Tree 题意&#xff1a;给定 n n n 个点的一棵边带权的树&#xff0c;点有黑白二色&#xff08; 0 , 1 0,1 0,1 表示&#xff09;&#xff0c;现在可以以 a i a_i ai​ 的价值翻转第 i i i 个点的颜色&#xff0c;一对异色点 ( u , v ) (u,v) (u,v) 的价值为树上路径的最…

视频监控汇聚平台EasyCVR视频分享页面WebRTC流地址播放不了是什么原因?

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多…

spring框架的配置方案

spring框架在使用过程中&#xff0c;需要对它进行一系列的配置才可以使用&#xff0c;在spring发展过程中&#xff0c;配置方式也发生了一些变化&#xff1a; 2.5版本前>xml 2.5版本后>annonationxml 3.0版本后>annonationjavaConfig配置类 目录 2.5版本前&#xff1a…

AI绘图实战(十二):让AI设计LOGO/图标/标识 | Stable Diffusion成为设计师生产力工具

S&#xff1a;AI能取代设计师么&#xff1f; I &#xff1a;至少在设计行业&#xff0c;目前AI扮演的主要角色还是超级工具&#xff0c;要顶替&#xff1f;除非甲方对设计效果无所畏惧~~ 预先学习&#xff1a; 安装及其问题解决参考&#xff1a;《Windows安装Stable Diffusion …