【C++重新认知】:泛型编程(模板编程)

一、什么是泛型编程

当我们设计函数或者类时,有时候需要对应不同数据类型编写相同的代码,这样的话不仅有代码冗余,而且更加的加大程序员开发事件,降低开发效率,因此泛型编程就是解决此类情况----不同的数据类型可以重用一个函数,或者可以创建不同数据类型的相同类。

二、泛型的声明

template <typename name ...>

样例:

#include <iostream>
using namespace std;template <typename _Tp>
_Tp Max(_Tp a,_Tp b)
{return a > b ? a : b;
}int main()
{cout << Max(1, 2) << endl; //传入两个整型cout << Max(10.55, 2.33) << endl;//传入两个浮点型return 0;
}

在这里插入图片描述

三、泛型的特性

1、显示和隐式传值
在这里插入图片描述
2、传常量
在这里插入图片描述
注意:当模板规定变量类型时调用的时候必须显示调用,并且传参只能传常量。
3、默认情况
在这里插入图片描述
4、普通函数和模板函数的优先级
在这里插入图片描述

可以看到普通函数的优先级是高于模板函数的

四、类模板

1、模板类样例

#include <iostream>
using namespace std;template <typename _Ty1,typename _Ty2>
class Data
{
public :Data();Data(_Ty1 one, _Ty2 two):m_one(one),m_two(two){}~Data();void printData();
private:_Ty1 m_one;_Ty2 m_two;
};
//用到类型的地方必须使用 类名<类型> 的方式使用
template <typename _Ty1,typename _Ty2>
void Data<typename _Ty1, typename _Ty2>::printData()
{cout << m_one << "  " << m_two << endl;
}
int main()
{Data<int, string>* data = new Data<int, string>(1,"abc");//必须显示创建类对象data->printData();return 0;
}template<typename _Ty1, typename _Ty2>
Data<_Ty1, _Ty2>::Data()
{
}template<typename _Ty1, typename _Ty2>
Data<_Ty1, _Ty2>::~Data()
{
}

注意:模板类的定义和实现必须在一个文件中,**不能.h中实现类的定义在.cpp文件中实现类方法等。**模板类的声明必须显示创建
2、类模板的特化
当我们需要处理特殊数据时就需要类模板的特化(因为有些设备不一样,对于相同的数据要进行不同方法进行处理)

#include <iostream>
using namespace std;template <typename _Ty1,typename _Ty2>
class Data
{
public :Data();Data(_Ty1 one, _Ty2 two):m_one(one),m_two(two){cout << "这是原本模板类" << endl;}~Data();
private:_Ty1 m_one;_Ty2 m_two;
};//完全特例
template <>
class Data<int,int>
{
public:Data(int one, int two) :m_one(one), m_two(two){cout << "这是特例类" << endl;}
private:int m_one;int m_two;
};int main()
{Data<int, int>* data1 = new Data<int, int>(1,1);Data<int, string>* data2 = new Data<int, string>(1,"abc");return 0;
}

在这里插入图片描述

五、可变模板

1、可变模板写法

template<typename ...Args>
void func(Args...args)
{.....
}

2、参数包的展开

  • 递归展开
#include <iostream>
using namespace std;//递归终止函数
void func()
{cout << endl;
}//展开函数
template <typename T,typename ...Args>
void func(T value,Args...args)
{cout<<value<< " ";//查看个数cout << sizeof...(args) << endl;func(args...);//最后参数包里面的个数为0时就匹配我们外边的func终止函数来结束递归展开
}int main()
{	func(1, 2, 3);return 0;
}

在这里插入图片描述

  • 逗号表达式展开
#include <iostream>
using namespace std;//展开函数
template <typename ...Args>
void func(Args...args)
{ int arr[] = { args... };for(auto c:arr){cout << c << " ";}cout << endl;
}int main()
{	func(1,2,3,4);return 0;
}

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

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

相关文章

关于在forEach循环中使用异步,造成forEach里面的函数还未执行完毕,外层的同步已经被执行的问题

使用 原生的 for循环替代forEach循环即可解决问题 1.实例代码&#xff1a; select_Father_comment_sql_res.forEach( (item) > {const Select_FId_children_sql util.format("Select *, \IFNULL(User.UserName,) as CommentUserName, \IFNULL(User.UserName,) as AtU…

代码随想录算法训练营Day35|LC860 柠檬水找零LC406 根据身高重建队列LC452 用最少数量的箭引爆气球

一句话总结&#xff1a;身高队列看起来不简单&#xff0c;实际上也很难。 原题链接&#xff1a;860 柠檬水找零 简单贪心思想即可。5元时加入cnt5&#xff0c;10元时cnt10&#xff0c;cnt5--&#xff0c; 20元时则优先找零10元再找零5元&#xff0c;这样最后判断是否在一次找零…

golang+vue微服务电商系统

golangvue微服务电商系统 文章目录 golangvue微服务电商系统一、项目前置准备二、项目简介三、代码GItee地址 golang、vue redis、mysql、gin、nacos、es、kibana、jwt 一、项目前置准备 环境的搭建 官方go开发工程师参考地址&#xff1a;https://blog.csdn.net/qq23001186/cat…

SpringBoot如何优雅的进行参数校验

一、传统参数校验 虽然往事不堪回首&#xff0c;但还是得回忆一下我们传统参数校验的痛点。 下面是我们传统校验用户名和邮箱是否合法的代码 if (username null || username.isEmpty()) {throw new IllegalArgumentException("用户名不能为空"); }if (isValidEmai…

Linux之文件管理与重定向

文件的管理 最开始说到过, 一个进程是可以打开多个文件的并且可以对这些文件做出不同的操作, 也就是说加载到内存中的文件可能存在多个. 操作系统要不要管理这些打开的文件呢? 当我们在程序里面打开多个文件时, 操作系统肯定是得对这些文件进行管理的, 而管理的本质就是对数…

【MySQL】存储过程、存储函数、触发器

目录 存储过程介绍技术背景存储过程的作用与优势存储过程跟自定义函数很像。它们的区别是&#xff1a; 存储过程的缺点存储过程的特性基本存储过程使用1.创建语法语法说明&#xff1a;使用案例1.创建获取新闻类别数量的存储过程2.创建获取指定新闻类别ID下新闻数量的存储过程 2…

【微服务-网关】SpringCloud GateWay核心技术

在前面的文章中我们介绍了微服务网关的基础知识&#xff0c;了解了什么是网关&#xff0c;网关有什么作用&#xff0c;以及市面上有哪些成熟的网关产品&#xff0c;最后了解了网关的配置技巧。通过上篇文章&#xff0c;大家应该可以在微服务架构中完成网关的基本配置。 但是&am…

2022 年甘肃省职业院校技能大赛 高职组 网络系统管理竞赛 网络构建模块试题

2022 年甘肃省职业院校技能大赛 高职组网络系统管理竞赛 网络构建模块试题 目 录 考试说明… 3 任务描述… 3 任务清单… 3 &#xff08;一&#xff09;基础配置… 3 &#xff08;二&#xff09;有线网络配置… 4 &#xff08;三&#xff09;无线网络配置… 6 &#xff08;四&a…

老大语录六 谈产品规划

老大语录六 谈产品规划 产品经理一个重要的职责就是做产品规划。它是考验产品经理对市场和需求的阅读能力,是决定一个产品在市场上跟竞争对手分出高下的必要条件,是最能体现产品经理水平的工作。 然而我们往往在执行过程中在这一步上做的并不是特别好。虽然很多企业都会容易建…

2024 年 5 款适用于 Linux 的参考文献管理软件

时间是宝贵的&#xff0c;因此如果某款软件能让您摆脱必须执行的日常繁琐任务&#xff0c;那么它就会派上用场。 参考文献管理工具就是此类软件的典型代表&#xff0c;只需点击几下就能自动格式化引文。学生、教育工作者、作家、科学家和研究人员一定会发现它们非常有用。 在…

NFTScan | 03.18~03.24 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2024.03.18~ 2024.03.24 NFT Hot News 01/ NFT 系列 NodeMonkes 地板价已超越 BAYC 3 月 18 日&#xff0c;据数据显示&#xff0c;NFT 系列 NodeMonkes 地板价已超越 Bored Ape Yacht …

9.2024

使用冒泡排序给{10 ,1,35,61,89,36,55}排序 代码&#xff1a; public class 第九题 {public static void main(String[] args) {int a[]{10,1,35,61,89,36,55};for (int i0;i<a.length-1;i){for (int j0;j<a.length-1;j){if (a[j]>a[j1]){int temp0;tempa[j];a[j]a[…

光致发光荧光量子产率测试光纤光谱仪

光致发光荧光量子产率测试系统是一种用于测量材料发光效率的高精度设备&#xff0c;它通过光致发光方法来确定样品的发射效率。光致发光荧光量子产率测试系统不仅提供了一种高效、可靠的测量手段&#xff0c;而且对于提升科学研究和工业应用中的发光材料性能具有重要作用。通过…

nacos集群搭建实战

集群结构图 初始化数据库 Nacos默认数据存储在内嵌数据库Derby中&#xff0c;不属于生产可用的数据库。官方推荐的使用mysql数据库&#xff0c;推荐使用数据库集群或者高可用数据库。 首先新建一个数据库&#xff0c;命名为nacos&#xff0c;而后导入下面的SQL&#xff08;直…

日常刷题之77-组合

题目 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案 提示&#xff1a;假设 n5,k3 就是需要组合出来&#xff0c;长度3且内容数据是在[1,n]这个区间内的所有可能得组合 同时一个组合里面内个数字只能出现一次&#…

日增500粉的全自动引流神器

全自动引流&#xff0c;采集曝光一体每天截流500&#xff0c;这是每个企业主和网红的终极梦想。今日&#xff0c;我将分享一套高效而可行的引流策略&#xff0c;帮助你实现这个目标。 我们需要理解&#xff0c;全自动引流并不意味着无人参与。相反&#xff0c;它仍需要你的参与…

【王道训练营】第6题 输入一个整型数,判断是否是对称数,如果是,输出yes,否则输出no

文章目录 我的代码改正代码其他代码 我的代码 没有完成 #include<stdio.h> int main(){int a;int b;int c0;//位数int d0;//比较几次scanf("%d",&a);while(b!0){bb/10;c;}dc/2;//比较几次int ffor(int i0 ;i<d;i){int ec;//位数fa - a / (((e-i-1)*10…

算法笔记~—位运算

目录 常见位运算&#xff1a; 1、基础位运算 2、对于一个数n。确定、修改这个数n二进制x位。 3、提取&#xff08;确定&#xff09;一个数n最右侧的1&#xff08;bit&#xff09;与干掉最右侧的1&#xff08;bit&#xff09; 4、异或运算律 5、位运算的优先级&#xff1a…

Go --- Go语言垃圾处理

概念 垃圾回收&#xff08;GC-Garbage Collection&#xff09;暂停程序业务逻辑SWT&#xff08;stop the world&#xff09;程序根节点&#xff1a;程序中被直接或间接引用的对象集合&#xff0c;能通过他们找出所有可以被访问到的对象&#xff0c;所以Go程序的根节点通常包括…

虚拟机Linux-openEuler硬盘空间扩容

虚拟机Linux-openEuler硬盘空间扩容 1、需求场景 我们在使用虚拟机时&#xff0c;可能会出现磁盘空间不够用导致各种bug出现的情况。 首先&#xff0c;我们要扩展虚拟机的可用磁盘空间。如图所示&#xff0c;我的原本硬盘大小为8G&#xff0c;我们扩展到30GB 2、打开虚拟机…