C++入门篇5---模板
相信大家都遇到过这么一种情况,为了满足不同类型的需求,我们要写多个功能相同,参数类型不同的代码,为此,C++引入了泛型编程这一概念,而模板就是实现泛型编程的基础,其实本质就是我们写一个类似”模板”的代码,当遇到不同类型需求时,编辑器会按照我们写的模板,自动生成对应类型的函数或类,来防止相似的代码写很多遍的情况。
举个例子,假设我们要写一个交换函数
//以前
void Swap(int& x,int& y){int tmp=x;x=y;y=tmp;
}//....将类型换成我们需要的类型//现在
//函数模板
template<class T>
void Swap(T& x,T& y){T tmp=x;x=y;y=tmp;
}
一、函数模板
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本
函数模板格式
template<typename T1, typename T2,......,typename Tn>
返回值类型 函数名(参数列表){}
注意:这里class和typename都可以,template的作用有点像typedef,这里特别提醒一点,每写一个函数模板或类模板,都要单独写一个template<>
下面写一个加法函数模板
template<class T>
T Add(const T& x, const T& y)
{return x + y;
}int main()
{cout << Add(1, 2) << endl;cout << Add(1.1, 2.2) << endl;return 0;
}

底层实现:编辑器根据传的参数,自动推导类型,然后根据模板实例化函数,然后运行得出答案
函数模板的实例化---显式实例化和隐式实例化
上面的代码就是隐式实例化,即类型是编辑器自动推导的,不是我们给的,但是当参数的类型不同时( 如Add(1,1.2) ),编辑器就会出现问题,因为T可能是int,也可能是double
这时我们有两种选择
1.强转,将两个类型统一,这样隐式实例化就能成立
2.显式实例化,直接用Add<int>表明T的类型,不用编辑器自动推动,
注意:如果有多个<class T1,class T2,...,class Tn>要根据顺序对应着写类型
代码如下
template<class T>
T Add(const T& x, const T& y)
{return x + y;
}
int main()
{//强转cout << Add(1, (int)1.2) << endl;cout << Add((double)1, 1.2) << endl;//显示类型转换cout << Add<int>(1, 1.2) << endl;cout << Add<double>(1,1.2) << endl;return 0;
}

当函数模板和实体函数同时存在时,如果不显示调用,编辑器会默认调用已经存在的实体函数,如下


函数模板的匹配原则
1. 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数
2. 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板
3. 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换
二、类模板
类模板格式
template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};
类模板的实例化
举个例子
template<class T>
class Vector
{
private:T* _a;size_t _size;size_t _capacity;
public:Vector(size_t n = 4):_a(new T[n]),_size(0),_capacity(n){}//void push(T x);//...~Vector();
};template<class T>
Vector<T>::~Vector()//在类外写定义要加类型名,即类名+<>,而在正常类中,类型名==类名
{delete[] _a;_size = _capacity = 0;
}int main()
{Vector<int>s1;//必须显式实例化Vector<double>s2;return 0;
}
相关文章:
C++入门篇5---模板
相信大家都遇到过这么一种情况,为了满足不同类型的需求,我们要写多个功能相同,参数类型不同的代码,为此,C引入了泛型编程这一概念,而模板就是实现泛型编程的基础,其实本质就是我们写一个类似”模…...
L2CS-Net: 3D gaze estimation
L2CS-Net: Fine-Grained Gaze Estimation in Unconstrained Environments论文解析 摘要1. 简介2. Related Work3. METHOD3.1 Proposed loss function3.2 L2CS-Net 结构3.3 数据集3.4 评价指标 4. 实验4.1 实验结果 论文地址:L2CS-Net: Fine-Grained Gaze Estimation…...
kenernetes/k8s笔试面试
k8s的基础概念 k8s本质是一个容器编排系统,可以管理容器的生命周期,应用部署,更新,维护,应用提供服务,扩容缩容应用,故障自愈。 k8s与docker的关系 docker:是一种轻量级的虚拟化技术。运维层…...
我们真的是在做数据治理吗
我们真的是在做数据治理吗? 什么是数据治理? 数据治理和数据管理有什么区别? 相信即使是考过数据治理工程师的人,面对这2个问题也仍然会有这个疑问。 目前国际和国内对于数据治理没有明确统一的定义,对于数据治理的服…...
聊聊汽车电子的话题
当谈到汽车电子时,有许多有趣的话题可以探讨。以下是一些可能感兴趣的话题: 自动驾驶技术:自动驾驶技术正变得越来越先进,它们如何在汽车中实现?它们将如何改变我们的交通方式以及对道路安全的影响? 电动汽…...
ThinkPHP6企业OA办公系统
有需要请加文章底部Q哦 可远程调试 ThinkPHP6企业OA办公系统 一 介绍 勾股OA基于ThinkPHP6开发,前端Layui,数据库mysql,是一款实用的企业办公系统。可多角色登录,集成了系统设置、人事管理、消息管理、审批管理、日常办公、客户…...
PPS Tester测量原理和实施方法
怿星科技发布了新品PPS Tester,这是一款基于1PPS方法的时间同步精度测试设备。PPS Tester由硬件模块ETS2110和上位机软件ePPSTester构成。本文将围绕此设备的应用场景,介绍相关概念和设备使用方法。 什么是时间同步? 时间同步就是采取某项技…...
浅谈新电改背景下电网企业综合能源服务商业模式研究及发展方向
安科瑞 华楠 摘要: 新电改方案实施后,由于输配电价的改革和售电侧的放开,电网企业的盈利模式也随之发生了变化。这就要求电网企业转变服务理念与经营方式,来寻求竞争优势。基于“魏朱六要素商业模式”模型,对电网企业综合能源服务…...
SpringBoot + Docker 实现一次构建到处运行~
一、容器化部署的好处 图片 Docker 作为一种新兴的虚拟化方式,它可以更高效的利用系统资源,不需要进行硬件虚拟以及运行完整操作系统等额外开销。 传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行…...
clang-format格式化代码
1. clang-format简介 Clang-Format可用于格式化(排版)多种不同语言的代码。其自带的排版格式主要有:LLVM, Google, Chromium, Mozilla, WebKit等; 利用style参数配置风格。通过编写 .clang-format 文件,可以实现代码风格的配置。…...
品牌宣传与媒体传播是声誉管理的主要方式之一
企业声誉是现如今影响品牌信任度、客户忠诚度的重要因素,也被视为企业的一种无形资,更影响着企业未来的发展。因此,企业声誉管理也日渐成为企业管理的重要课题之一,尤其在品牌营销管理领域。 什么是声誉管理?声誉管理有…...
2023年8月7日-8月13日,(上午熟悉公司代码,周一到周五晚上优先工作所急视频教程,其他业余时间进行ue视频教程,为独立游戏做准备)
按照规划,上午熟悉公司源码,下午进行filament和ue渲染,晚上写工作代码。回家后泛读pbrt或者其他书籍催眠。 业余学习ue的各种视频教程,为独立游戏做准备(公司也实行末位淘汰,给自己留条后路)。累…...
Vue3 第二节 Vue3的响应式
1.Vue3的响应式原理 2.ref函数和reactive函数的对比 3.setup注意点 一.Vue3的响应式原理 1.Vue2.x中的响应式原理 ① 实现原理 对象类型:通过Object.defineProperty() 对属性的读取,修改进行拦截(数据劫持)数组类型…...
通过easyui实现动态控制表格字段显示、导出表格数据
前言 学过layui前端框架的都知道,layui默认帮我们实现了控制表格字段显示以及数据的导出功能。 1、控制表格字段显示 2、数据导出 3、导出为pdf:导出按钮的右边那个按钮就是打印pdf的 那么,easyui要怎么实现这些功能呢?这篇文章就…...
JWT入门,jwt可以解密吗?
JWT 什么是 JWT JSON Web Token,通过数字签名的方式,以 JSON 对象为载体,在不同的服务终端之间安全地传输信息 官网:https://jwt.io/SDK: https://jwt.io/libraries (含Java和各种语言)Java SDK(上面的SDK链接得到): https://g…...
36.利用解fgoalattain 有约束多元变量多目标规划问题求解(matlab程序)
1.简述 多目标规划的一种求解方法是加权系数法,即为每一个目标赋值一个权系数,把多目标模型转化为一个单目标模型。MATLAB的fgoalattain()函数可以用于求解多目标规划。 基本语法 fgoalattain()函数的用法: x fgoalattain(fun,x0,goal,weig…...
EPPlus 读取和生成Excel
在项目中添加了EPPlus库的引用,你可以通过NuGet包管理器或手动将EPPlus库添加到项目中。同时,需要注意的是EPPlus库支持的是xlsx格式的Excel文件。 读取 使用EPPlus读取本地Excel文件的示例代码如下: using OfficeOpenXml;public void Rea…...
Java wait() notify() join()用法讲解
一、wait() 1. 源码: 实际调用本地方法 2. 作用 释放当前锁,并让当前线程进入等待状态;timeoutMillis为等待时间,单位毫秒,如果为0则表示无限等待下去;该方法使用前提是:当前执行线程必须持…...
新手注意事项-visual studio 来实现别踩白块儿
自己之前为了熟悉easyx练习过一个简单的项目,别踩白块儿,链接在这里,别踩白块儿,当时比较稚嫩,很多东西都不会,可以说是只知道最基本的语法,头文件都不知道,一个一个查资料弄懂的&am…...
【力扣】2810. 故障键盘 <模拟>
【力扣】2810. 故障键盘 你的笔记本键盘存在故障,每当你在上面输入字符 ‘i’ 时,它会反转你所写的字符串。而输入其他字符则可以正常工作。给你一个下标从 0 开始的字符串 s ,请你用故障键盘依次输入每个字符。返回最终笔记本屏幕上输出的字…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
