C++模板写法详解
模板
- 概念
- 模板就是建立通用的模具,大大提高复用性
- 模板主要体现了cpp编程的另外一种思想泛型编程
- cpp提供两种模板机制
- 函数模板
- 类模板
- 函数模板
- 作用
- 建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表
- 语法
template<typename T>函数声明或定义//template 声明创建模版//typename 表面其后面的符号是一个数据类型,可以用class代替//T 通用数据类型,名称可替换
- 使用语法
- 自动类型推导
- mySwap(a, b);
- 显示指定类型
- mySwap(a, b);
- 自动类型推导
- 举例
#include<iostream>using namespace std;template<typename T>void mySwap(T& a, T& b){T temp = a;a = b;b = temp;}int main(){int a = 10;int b = 20;double c = 3.54;double d = 4.43;mySwap(a, b);mySwap<double>(c, d);cout << a << b << endl;cout << c << d << endl;return 0;}
- 本质类型参数化
- 注意事项
- 自动类型推导,必须要推导出类型一致的数据类型T才可以使用
- 模版必须要确定出T的数据类型,才可以使用
- class可以用于函数也可以用于类typename只能用于函数
- 普通函数与函数模板的区别
- 普通函数调用时可以发生自动类型转换(隐式类型转换)
- 函数模版调用时,如果利用自动类型推导,不会发生隐式类型转换
- 如果利用显示制定类型的方式,可以发生隐式类型转换
- 普通函数和函数模板的调用规则
- 如果函数模板和普通函数都可以实现,优先调用普通函数
- 可以通过空模板参数列表来强制调用函数模板
- 函数模板也可以发生重载
- 如果函数模板可以更好的匹配则优先调用函数模板
myfunc<>(a, b)//空模板
- 模板的局限性
- 有些特定数据类型要用具体化方式做特殊实现
#include<iostream>#include<string>using namespace std;class Person{public:string m_name;int m_age;Person(string name, int age){m_name = name;m_age = age;}//函数重载是一种方法// bool operator==(const Person& p){// if(this->m_age == p.m_age && this->m_name == m_name)// return true;// else// return false;// }};template<class T>void myCompare(T& a, T& b){if(a == b){cout << "same" << endl;}else{cout << "different" << endl;}}//利用具体化Person的版本实现代码,具体化优先调用template<>void myCompare(Person& a, Person& b){if(a.m_age == b.m_age && a.m_name == a.m_name)cout << "same" << endl;else cout << "different" << endl;}void test(void){Person a("zhangsan",20);Person b("zhangsan", 10);myCompare(a, b);}int main(){test();return 0;}
- 作用
- 类模板
- 类模板作用
- 建立一个通用类,类中成员数据类型可以不具体制定,用一个虚拟的类型来表示
- 语法
template<typename T>类
- 简单举例
#include<iostream>#include<string>using namespace std;template<class NameType, class AgeType>class Person{public:NameType m_name;AgeType m_age;Person(NameType name, AgeType age){this->m_age = age;this->m_name = name;}void ShowInfor(void){cout << "my name is " << this->m_name << endl;cout << "my age is " << this->m_age << endl;}};void test(void){Person<string, int>p("zhangsan", 18);//必须显式调用p.ShowInfor();}int main(){test();return 0;}
- 类模板与函数模板的区别
- 类模板没有自动推导的使用方式
- 类模板在模板参数列表中可以有默认参数
- template<class NameType, class AgeType = int>
- 类模板中成员函数创建时机
- 普通类中的成员函数一开始就可以创建
- 类模板中的成员函数在调用时才创建
- 类模板对象做函数参数—如何给函数传入类模板所创造的对象
- 传入方式
- 指定传入类型—直接显示对象的数据类型
- 参数模板化—将对象中的参数变为模板进行传递
- 整个类模板化—将这个对象类型模板化进行传递
- 举例
#include<iostream> #include<string> using namespace std; template<class NameType, class AgeType> class Person{public:NameType m_name;AgeType m_age;Person(NameType name, AgeType age){this->m_age = age;this->m_name = name;}void ShowInfor(void){cout << "my name is " << this->m_name << endl;cout << "my age is " << this->m_age << endl;} }; //指定传入类型---最常用 void Personshow1(Person<string, int> &p){p.ShowInfor(); } void test1(void){Person<string, int>p("zhangsan", 18);Personshow1(p); } //参数模板化 template<class T1, class T2> void Personshow2(Person<T1, T2> &p){p.ShowInfor(); } void test2(void){Person<string, int>p("zhangsan", 28);Personshow2(p); } // 整个类型模板化 template<class T> void Personshow3(T &p){p.ShowInfor(); } void test3(void){Person<string, int>p("zhangsan", 38);Personshow3(p); } int main(){test1();test2();test3();return 0; }
- 传入方式
- 类模板与继承
- 当子类继承的父类是一个类模板时,子类在声明时候,要指出父类中T的类型
- 如果不指定,编译器无法给子类分配内存
- 如果想灵活指定出父类中T的类型,子类也需变为类模板
- 简单例子
#include<iostream>#include<string>using namespace std;template<class T>class Base{public:T name;};//第一种继承方法class Son1: public Base<string>{public:void showInfor(void){cout << "my name is " << this->name << endl; }};// 第二种方法进一步扩大模板template<class T1, class T2>class Son2: public Base<T1>{public:T2 age;void showInfor(void){cout << "my name is " << this->name << endl; cout << "my age is " << this->age << endl; }};void test1(void){Son1 s;s.name = "zhangsan";s.showInfor();}void test2(void){Son2<string, int>s;s.name = "zhangsan";s.age = 18;s.showInfor();}int main(){test1();test2();return 0;}
- 类模板中的成员函数的类外实现
- 普通的类外实现
#include<iostream>#include<string>using namespace std;class Person1{public:void printInfor(void);};void Person1::printInfor(void){cout << "this is the test" << endl;}int main(){Person1 P1;P1.printInfor();return 0;}
- 普通的类外实现
- 模板的类外实现
#include<iostream> #include<string> using namespace std; template<class T> class Person1{public:T m_name;Person1(T name);void printInfor(void); }; template<class T>//即使不用T也要添加这个列表 Person1<T>::Person1(T name){this->m_name = name; } template<class T>//即使不用T也要添加这个列表 void Person1<T>::printInfor(void){cout << "this is the test" << endl; } int main(){Person1<string>P1("zhangsan");P1.printInfor();return 0; }
- 总结
- 主要是要同步声明其为模板
- 在定义过程的最开始要加入模板列表
- 总结
- 类模板分文件编写
- 问题
- 类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到
- 解决
- 直接包含cpp文件
- 一般我们include的都是.h文件,此处可以改为.cpp文件
- 原因
- 模板类不会一开始就生成,因此包含.h并没有什么用
- 将声明和实现写在同一个文件中,并更改后缀名为.hpp,这是约定不是强制,用于实现类模板的实现
- 直接包含cpp文件
- 问题
- 类模板与友元
- 掌握类模板配合友元函数的类内和类外实现
- 全局函数类内实现—直接在类内声明友元即可—推荐—直接加入friend然后定义即可
- 全局函数的类外实现—需要提前让编译器知道全局函数的存在
- 类模板作用
相关文章:
C++模板写法详解
模板 概念 模板就是建立通用的模具,大大提高复用性 模板主要体现了cpp编程的另外一种思想泛型编程cpp提供两种模板机制 函数模板类模板 函数模板 作用 建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表 语…...

【备战面试】每日10道面试题打卡-Day2
本篇总结的是Java基础知识相关的面试题,后续也会更新其他相关内容 文章目录1、 和 equals 的区别是什么?2、你重写过 hashcode 和 equals 吗,为什么重写equals时必须重写hashCode方法?3、为什么Java中只有值传递?4、BI…...

“数字档案室测评”相关参考依据梳理
数字档案室建设无疑比数字档案馆建设应用范围更为广泛,涉及的单位类型和专业领域也更多。这一点从国家档案局的机构设置上也可以看出端倪: 国家档案局两个内设业务指导司中,档案馆(室)业务指导司主要针对档案馆和机关档案室,而经济…...

android 动态加载jar包
什么时候需要用到动态加载jar包呢? 减少apk本身大小,某些界面才需要用jar里的功能jar中的功能可以独立开发,不要依赖其它的东西,能适用各个项目和第三方公司合作,人家不提供项目源码给你,但又要开发他们使…...

JAVA版B2B2C商城源码多商户入驻商城
三勾商城多商户是开发友好的微信小程序商城,框架支持SAAS,支持发布 iOS Android 公众号 H5 各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)等多个平台,不可多得的二开神器, 为大中小企业提供极致的移…...

测试人员如何在测试环境数据库批量生成测试数据?方案分享
测试人员为了测试某个特定场景,往往需要在测试环境数据库中插入特定的测试数据来满足需求;性能测试时,常需要在测试环境生成大量可用测试数据来支持性能测试;建设持续集成持续交付体系时,我们往往也需要在测试环境生成…...

【el】表单
elementUI中的表单相关问题一、用法1、动态表单调用接口返回表单,后端的接口返回值如下:这些是渲染后的效果页面使用(父组件)<el-button size"small" class"Cancelbtn" click"sub(true)">发起…...

【Flutter入门到进阶】Flutter基础篇---布局
1 GridView网格布局组件 1.1 说明 1.1.1 图例 1.1.2 说明 GridView网格布局在实际项目中用的也是非常多的,当我们想让可以滚动的元素使用矩阵方式排列的时 候。此时我们可以用网格列表组件GridView实现布局 GridView创建网格列表主要有下面三种方式 1、可以通过Gr…...

python海龟绘图
一、基础 (一)介绍 海龟绘图(Turtle Graphics):“小海龟”turtle是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始…...

【计算机网络】数据链路层
概述 封装成帧 差错检验 可靠传输 实现机制 可靠传输的实现机制 停止等待协议 回退N帧协议 选择重传协议 【计算机网络】MAC帧和PPP帧(定义使用范围区别共同点)_GPNU_Log的博客-CSDN博客_ppp帧 PPP帧和以太网帧 | Mixoo 数据链路层的协议有PPP协…...

使用groovy代码方式解开gradle配置文件神秘面纱
来到这里的是不是都有以下疑问: 1.build.gradle配置文件结构好复杂啊,怎么记? 2.内部是怎么进行分析和执行的? 3.为什么可以在配置文件里面写groovy代码,怎么识别的? 4.怎么才能很方便的记住和快速上手…...
kafka入门到实战二(使用docker搭建kafka集群)
使用Docker搭建kafka单机/集群 拉取镜像:2.8.0之前,kafka都需要依赖zookeeper docker pull wurstmeister/kafka docker pull wurstmeister/zookeeper运行zookeeper镜像 docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper运行ka…...
【简化开发】lombok的使用、编译后的代码及源码
lombok的使用导入依赖一、getter、Setter、toString1、getter、Setter分别生成getxxx()和setxxx()方法2、toString生成toString()方法,按顺序打印类名称以及每个字段,并以逗号分隔二、NoArgsConstructor、RequiredArgsConstructor、AllArgsConstructor1、…...

在线就能用的主图设计素材,免费分享!
如何给自己的店铺商品设计专属的节日活动主图?没有节日活动的主体素材要如何设计?下面小编就分享一个在线素材设计工具,打开乔拓云,平台里面不仅有许多能使用的电商设计素材,还有许多的设计工具和模板能帮助你快速的实…...

【测绘程序设计】——计算卫星位置
本文分享了根据广播星历计算卫星于瞬时地固系下位置的计算程序(C#版)(注:瞬时地球坐标系坐标经极移改正即可获得协议地球坐标系坐标),相关源代码(完整工程,直接运行;包含实验数据)及使用示例如下。 目录 Part.Ⅰ 使用示例Part.Ⅱ 代码分析Chap.Ⅰ 数据结构Chap.Ⅱ 计…...
山东双软认证的基本条件
一、山东双软认证的基本条件 "双软认证"是指软件产品评估和软件企业评估;企业申请双软认证除了获得软件企业和软件产品的认证资质,同时也是对企业知识产权的一种保护方式,更可以让企业享受国家提供给软件行业的税收优惠政策;我们…...
TPM 2.0实例探索3 —— LUKS磁盘加密(4)
接前文:TPM 2.0实例探索2 —— LUKS磁盘加密(3) 本文大部分内容参考: Code Sample: Protecting secret data and keys using Intel Platform... 二、LUKS磁盘加密实例 4. 将密码存储于TPM的PCR TPM平台配置寄存器(…...
Linux连接RDP远程服务工具集记录
目录 rdesktop 安装 实例 xfreerdp 安装 实例 remmia 介绍 rdesktop 安装...

离散事件动态系统
文章目录离散事件动态系统ppt离散事件系统建模离散事件动态系统的基本组成元素离散事件动态系统仿真具体建模petri建模实例离散事件动态系统 ppt ppt 仿真建模步骤 离散事件系统建模 from:离散事件系统建模 离散事件动态系统的基本组成元素 (1&am…...

无线WiFi安全渗透与攻防(二)之打造专属字典
系列文章 无线WiFi安全渗透与攻防(一)之无线安全环境搭建 打造专属字典 什么在破解之前先准备专用字典,因为对于一般家庭来说,常用 一个是预共享密钥PSK,一个是PIN码。 也不是所有的路由都开起了PIN码,一般都会开启域共享密钥…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...