C++泛型编程,函数模板和类模板

news2025/4/21 14:35:25

C++模板

模板概念:泛型编程,将类型参数化,在编译阶段不指定参数类型,运行阶段动态获取参数的技术,C++中分为函数模板和类模板

语法:

template<typename T>

template  --  声明创建模板

typename -- 表明其后面的符号是一种数据类型,可以用class代替

T -- 通用的数据类型,名称可以替换,通常为大写字母

函数模板:

函数模板的语法和使用:

函数模板:建立一个通用函数,函数返回值和形参类型可不具体制定,用虚拟类型代替

template<typename T>
void mySwap(T &a,T &b){
    T temp=a;
    a=b;
    b=temp;
}

函数模板的使用方法:

1、自动类型推导:直接调用函数,由编译器自动推导参数类型

int a=10;
int b=20;
mySwap(a,b);

2、显示指定类型:调用函数时显示指定参数类型

//2、显示指定类型
mySwap<int,int>(a, b);
cout << "a=" << a << endl;
cout << "b=" << b << endl;

函数模板和普通函数的区别:

  1. 普通函数调用可以发生隐式类型转换
  2. 函数模板,用自动类型推导,不可以发生隐式类型转换
  3. 函数模板,用显示指定类型,可以发生隐式类型转换
//两个整型交换
void swap04(int a, int b) {
	cout << "调用swap(a,b)" << endl;
	cout << typeid(a).name() << endl;
	int temp = a;
	a = b;
	b = temp;
}
//函数模板
template<typename T>
void mySwap(T a, T b) {
	cout << "调用mySwap(a,b)" << endl;
	cout << typeid(a).name() << endl;
	T temp = a;
	a = b;
	b = temp;
}

int main() {
	int a = 10;
	int b = 20;
	short c1 = 10;
	short c2 = 20;
	//普通函数自动类型转换,将short转换为int类型
	swap04(c1, c2);

	//函数模板,自动类型推导,强制匹配不会发生自动类型转换,输出的时short 类型
	mySwap(c1, c2);
	//函数模板,显示指定类型,会发生自动类型转换,将short转换为int类型
	mySwap<int>(c1, c2);
	

	return 0;
}

函数模板和普通函数的调用规则:

  1. 函数模板和普通函数都可以实现,优先调用普通函数
  2. 可以通过空模板参数列表来强制调用函数模板
  3. 函数模板也可以重载
  4. 函数模板可以产生更好的匹配优先调用函数模板
    void myPrint(int a, int b) {
    	cout << "这是普通函数myPringt(int a, int b)" << endl;
    }
    template <typename T>
    void myPrint(T a, T b) {
    	cout << "这是函数模板myPrint(T a, T b)" << endl;
    }
    template <typename T>
    void myPrint(T a, T b,T c) {
    	cout << "这是函数模板myPrint(T a, T b,T c)" << endl;
    }
    
    
    int main() {
    	int a = 10;
    	int b = 20;
    	int c = 30;
    	
    	//优先调用普通函数
    	myPrint(a, b);
    	//空模板参数列表
    	myPrint<>(a, b);
    	//模板函数重载
    	myPrint(a, b, c);
    	//函数模板更好匹配,short可以转为int类型,但是函数模板T可以直接推导short类型,优先匹配函数模板
    	short c1 = 10;
    	short c2 = 20;
    	myPrint(c1, c2);
    	return 0;
    }

函数模板的局限性

模板的通用性并非万能

  1. 传入的是数组,数组之间是不可以直接赋值的
    1. template<typename T>
      void myswap(T a,T b) {
      	T temp = a;
      	a = b;
      	b = temp;
      }
      

      这个代码如果传入的是数组,无法正常使用

  2. 传入的是自定义类型,很多操作是无法进行的,如赋值,相等的比较

     解决方法:

  1.         运算符重载
  2. bool operator==(Person& p) {
    	return this->name == p.name && this->age ==p.age ? true : false;
    }

  3.         利用具体化Person的版本实现代码,具体化优化代码
  4. 
    template<typename T>
    bool myCompare(T& a, T& b) {
    	return a == b ? true : false;
    }
    
    template<>
    bool myCompare(Person &p1, Person &p2) {
    	return p1.name==p2.name&&p1.age== p1.age? true : false;
    }

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

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

相关文章

Windows系统安装FinalShell

一、下载 通过百度网盘分享的文件&#xff1a;finalshell_install.exe 链接&#xff1a;https://pan.baidu.com/s/1_vcb_t-Cp4TZSN4nWUmLww 提取码&#xff1a;d6v8 二、安装 三、远程连接Linux系统 (1)打开VMware虚拟机 右键空白区域&#xff0c;点击open Terminal 输入命令…

数字信封+数字签名工具类测试样例(Java实现)

加解密过程 加密&#xff1a; 生成加密方SM2密钥对用于签名使用生成的SM2私钥生成数字签名生成SM4对称密钥对明文进行对称加密使用与解密方提前约定好的SM2公钥对第三步中的SM4对称密钥进行非对称加密把【加密方SM2公钥】、【数字签名】、【SM4对称加密后的密文】和【SM2非对…

Linux基础复习(四)

前言 上一篇文章配置了yum仓库和Tab自动补全&#xff0c;这一篇就开始详细介绍各命令 一、基础命令 pwd pwd命令全称Print Working Directory 打印工作目录&#xff0c;就是查看当前所在位置的目录路径 cd cd全称 Change Directory 切换目录&#xff0c;就是切换工作目录…

docker compose 安装rocketmq 4.x

官网参照 前置环境搭建 目录创建 创建两个目录 logs和store,用于存放日志和数据信息&#xff0c;位置随意&#xff0c;这里我放在/home/rockermq目录下 broker.conf 创建一个空文件broker.conf 在空文件中添加 # broker 对外提供服务的ip&#xff0c;如果是公网&#xff…

前端播放rtsp视频流(最后使用WebRtc)

前端播放rtsp视频流&#xff08;最后使用WebRtc&#xff09; 前言&#xff1a; ​ 项目需要将实验室里的摄像头画面引入到前端页面中&#xff0c;故对目前常见的几种方法进行了尝试&#xff0c;虽然过程坎坷但结局是好的。 一些尝试&#xff1a; RTSPtoWebRtc工具 由于RTSPt…

npm publish出错,‘proxy‘ config is set properly. See: ‘npm help config‘

问题&#xff1a;使用 npm publish发布项目依赖失败&#xff0c;报错 proxy config is set properly. See: npm help config 1、先查找一下自己的代理 npm config get proxy npm config get https-proxy npm config get registry2、然后将代理和缓存置空 方式一&#xff1a; …

相对位置偏置代码解析

1. 初始化相对位置偏置嵌入 self.rel_pos_bias nn.Embedding((2 * window_size - 1) ** 2, self.heads) 假设window_size7、slef.heads4,则 2 * window_size - 1 13&#xff1b;嵌入层的大小为13*13169&#xff0c;创建一个大小为169*4的嵌入矩阵。 2. 创建位置索引 pos …

OpenGL入门第六步:材质

目录 结果显示 材质介绍 函数解析 具体代码 结果显示 材质介绍 当描述一个表面时&#xff0c;我们可以分别为三个光照分量定义一个材质颜色(Material Color)&#xff1a;环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting)。通过为每…

springboot整合 knife4j 接口文档

第一步&#xff1a;引入依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi2-spring-boot-starter</artifactId><version>4.4.0</version></dependency> 第二步&#xff1a;写入配置 方…

国内NAT服务器docker方式搭建rustdesk服务

前言 如果遇到10054,就不要设置id服务器!!! 由于遇到大带宽,但是又贵,所以就NAT的啦,但是只有ipv4共享和一个ipv6,带宽50MB(活动免费会升130MB~) https://bigchick.xyz/aff.php?aff322 月付-5 循环 &#xff1a;CM-CQ-Monthly-5 年付-60循环&#xff1a;CM-CQ-Annually-60官方…

2024后端开发面试题总结

一、前言 上一篇离职贴发布之后仿佛登上了热门&#xff0c;就连曾经阿里的师兄都看到了我的分享&#xff0c;这波流量真是受宠若惊&#xff01; 回到正题&#xff0c;文章火之后&#xff0c;一些同学急切想要让我分享一下面试内容&#xff0c;回忆了几个晚上顺便总结一下&#…

SQL数据库:通过在视频监控平台服务器上直接使用SQL存储过程,在海量记录中查询特定时间段内-某个摄像头的所有视频片段

目录 一、背景 1、存储过程 2、视频监控系统 二、需求和数据表 1、具体要求 2、数据表 3、部分数据 三、实现 1、目标 2、创建存储过程 &#xff08;1&#xff09;存储过程代码 &#xff08;2&#xff09;创建成功 3、存储过程的解释 4、SQL命令调用方式 5、调用…

【FunClip】阿里开源AI视频剪辑神器:全面体验与教程

目录 引言1. FunClip概览1.1 什么是FunClip1.2 FunClip的市场定位1.3 FunClip的创新意义 2. FunClip的功能特性3. FunClip的实际应用案例4. FunClip的使用教程4.1 在线体验FunClip4.2 本地部署Gradio版本4.3 命令行运行 结语参考引用 引言 随着数字媒体的蓬勃发展&#xff0c;…

OpenGL笔记十五之GLM叠加实验

OpenGL笔记十五之GLM叠加实验 —— 2024-07-27 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记十五之GLM叠加实验1.每一帧都旋转的三角形2.每一帧在旋转前&#xff0c;都重置为一次单位矩阵&#xff0c;这要只会旋转1度3.每一帧旋转前&#xff0c…

centos stream 9安装 Kubernetes v1.30 集群

1、版本说明&#xff1a; 系统版本&#xff1a;centos stream 9 Kubernetes版本&#xff1a;最新版(v1.30) docker版本&#xff1a;27.1.1 节点主机名ip主节点k8s-master172.31.0.10节点1k8s-node1172.31.0.11节点2k8s-node2172.31.0.12 2、首先&#xff0c;使用Vagrant和Virt…

XSS漏洞:xss.haozi.me靶场1-12 | A-F

目录 0x00&#xff08;无限制&#xff09; 0x01&#xff08;闭合标签绕过&#xff09; 0x02&#xff08;双引号闭合绕过&#xff09; 0x03&#xff08;过滤括号&#xff09; 0x04&#xff08;编码绕过&#xff09; 0x05&#xff08;注释闭合绕过&#xff09; 0x06&#…

【网络爬虫技术】(1·绪论)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;网络爬虫开发技术入门_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 …

【C语言】两个数组比较详解

目录 C语言中两个数组比较详解1. 逐元素比较1.1 示例代码1.2 输出结果1.3 分析 2. 内置函数的使用2.1 示例代码2.2 输出结果2.3 分析 3. 在嵌入式系统中的应用3.1 示例代码3.2 输出结果3.3 分析 4. 拓展技巧4.1 使用指针优化比较4.2 输出结果4.3 分析 5. 表格总结6. 结论7. 结束…

yolov8 训练模型

一、准备数据 1.1 收集数据 以拳皇为例&#xff0c;将录制的游戏视频进行抽帧。 import cv2 import os# 视频文件路径 video_path 1.mp4# 输出帧的保存目录 output_dir ./output_frames os.makedirs(output_dir, exist_okTrue)# 读取视频 cap cv2.VideoCapture(video_pa…

7-25学习笔记

一、锁对象 Lock接口 1、创建锁对象 ReentrantLock类 Lock locknew ReentrantLock(true); 默认创建的是非公平锁 在创建锁对象时传入一个true参数 便会创建公平锁 先来后到 是重入锁 排他锁 加锁后不允许其它线程进入 2、加锁、解锁 &#xff08;1&#xff09;loc…