【C++】初阶模板

前言:

        当我们要实现一个交换函数的时候,以我们现在的水平要实现一个很简单,但是我们是实现的函数仅仅可以对对指定类型进行交换,假设我们要实现一个int类型,我们就要写一个支持int类型更换的函数,只要类型一换我们就要重新写一个,而且重新写一个的底层逻辑基本是一样,这样就会造成我们的代码很冗余。而今天我们要讲的内容就很好的解决了这个问题——模板。

一、泛型编译:

        泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

        我们现在的水平可以使用函数重载来实现一个交换函数:
 

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
void Swap(double& left, double& right)
{double temp = left;left = right;right = temp;
}
void Swap(char& left, char& right)
{char temp = left;left = right;right = temp;
}

        但是使用函数重载来实现的话,只要我们一增加一个类型,我们就要重新重载一个函数,而且因为逻辑基本相同,只要其中一个函数有问题,其余的都有问题,代码可维护性较低。

二、函数模板:

1.概念:

        函数模板代表了一个大家族,改模板与类型无关,在使用时被参数化,根据实参的类型生成特定函数类型版本。

2.格式:

template<typename T1,typename T2,...typename Tn>

返回值类型 函数名(参数列表){}

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)
 

//例如上面讲到的交换函数就可以这样实现:
template<typename T1,typename T2>
void swap(T1 a,T2 b)
{int tmp = a;a = b;b = tmp;
}

3.原理:

        函数模板是一个蓝图,它本身不是一个函数,是编译器使用方式生成特定具体类型函数的模具。说白了就是本来应该我们程序员来做的事情交给了编译器来完成。

        在编译器编译阶段,对于模板函数的使用,编译器是根据传入实参类型进行推导且生成对应类型函数以供调用。比如:我们用int类型使用该模板时,编译器通过对实参类型进行推导,将T1,T2确定为int类型,然后生成一个int类型的交换函数。

4.函数模板的实例化:

        用不同类型的参数使用函数模板时,称之为函数模板的实例化。模板参数实例化可以分为:隐式实例化和显示实例化。

Ⅰ.隐式实例化:让编译器根据实参类型进行推演

template<typename T1,typename T2>
void swap(T1 a,T2 b)
{int tmp = a;a = b;b = tmp;
}
int main()
{int a = 0;int b = 10;swap(a, b);return 0;
}

Ⅱ.显示实例化:在函数名后的<>中指定模板参数的实际类型

template<typename T1,typename T2>
void swap(T1 a,T2 b)
{int tmp = a;a = b;b = tmp;
}
int main()
{/*int a = 0;int b = 10;*/float c = 10.1;float d = 11.2;/*swap(a, b);*/swap<float, float>(c, d);return 0;
}

如果类型匹配,编译器会进行隐式类型转换。如果转换不成功编译器会报错。

5.模板参数匹配原则:

Ⅰ.一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数

// 专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}
// 通用加法函数
template<class T>
T Add(T left, T right)
{return left + right;
}
void Test()
{Add(1, 2); // 与非模板函数匹配,编译器不需要特化Add<int>(1, 2); // 调用编译器特化的Add版本
}

Ⅱ.对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板:

// 专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}
// 通用加法函数
template<class T>
T Add(T left, T right)
{return left + right;
}
void Test()
{Add(1, 2); // 与非函数模板类型完全匹配,不需要函数模板实例化Add(1, 2.0); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add函数
}

Ⅲ.模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

三、类模板:

1.格式:

template<class T1, class T2, ..., class Tn>
class 类模板名
{//类内成员定义
};

2.类模板实例化:

        类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

//Stack类名,Stack<int>才是类型
Stack<int>s1;
Stack<double>s2;

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

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

相关文章

预览控制;预见控制;预测控制;预观控制(preview control)

预演控制&#xff08;preview control&#xff09;作为一种新兴的控制方法&#xff0c;首次在轮式车辆中被提出。 参考文献&#xff1a; https://www.sciencedirect.com/science/article/pii/S0016003219300390https://www.sciencedirect.com/science/article/pii/S0016003219…

Ardupilot开源飞控之VTOL之旅:配件试装

Ardupilot开源飞控之VTOL之旅&#xff1a;配件试装 1. 源由2. 分析2.1 【修改使用】FC & PDB & GPS打印件2.2 【直接使用】VTX & CRSF打印件 3. 试装3.1 【结构】问题1&#xff1a;GPS座子尺寸非常紧凑&#xff0c;需要用力压入卡座内。3.2 【结构】问题2&#xff…

docker启动nginx

创建配置文件 touch /nginx/ngin.conf 内容如下&#xff1a; #user nobody; worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_type application/octet-stream;sendfile on;underscores_in_headers on; #该配置表示…

实验报告-实验四(时序系统实验)

软件模拟电路图 说明 SW&#xff1a;开关&#xff0c;共六个Q1~Q3&#xff1a;输出Y0~Y3&#xff1a;输出 74LS194 首先&#xff0c;要给S1和S0高电位&#xff0c;将A~D的数据存入寄存器中&#xff08;如果开始没有存入数据&#xff0c;那么就是0000在里面移位&#xff0c;不…

memcached怎么使用

Memcached 是一个用于缓存数据的开源、高性能、分布式内存对象缓存系统&#xff0c;通常用于提高应用程序的性能&#xff0c;减少数据库负载。它通过在内存中存储键/值对来加速数据的读取和写入。 以下是使用 Memcached 的一般步骤&#xff1a; 步骤 1: 安装和启动 Memcached…

智慧小区园区如何布局网络对讲系统

智慧小区园区如何布局网络对讲系统 随着小区住宅的不断更新发展&#xff0c;小区的管理人员也对小区内部的通讯也有了新的要求&#xff0c;要求在工作区域无盲区、语音通讯清晰&#xff0c;小区的安保后勤都能够随时在小区的地下室和室外工作区域、任何时间进行通信。提高小区…

Python 云服务器应用,Https,定时重启

Python 云服务器应用,Https,定时重启 环境搭建Python模块模块导入生成Flask实例GET处理启动服务器打开网页验证 GET接入证书 支持https申请证书下载证书保留 xxx.crt 和 xxx.key文件就可以了 copy到python项目目录ssl_context 配置 宝塔面板操作在www目录下新建python工作目录在…

CRM立项正当时|走过复杂多变的2023年,明年如何锚定确定性增长?

正值年末&#xff0c;又到复盘今年、规划明年的重要节点。 2023年&#xff0c;黑天鹅和新风口轮番登场&#xff0c;当不确定成常态&#xff0c;环境愈发错综复杂&#xff0c;企业家们如何深谋远虑&#xff0c;带领企业实现可持续、高质量发展&#xff1f;这里提供三个思考视角…

【目标检测】YOLO格式数据集txt标注转换为COCO格式JSON

YOLO格式数据集&#xff1a; images |--train |--test |--vallabels |--train |--test |--val 代码&#xff1a; import os import json from PIL import Image# 设置数据集路径 dataset_path "path/to/your/dataset" images_path os.path.join(dataset_path, &…

LoadRunner12.55的简介与安装

提示&#xff1a;https://mp.weixin.qq.com/s/iK-fh0VP7v8mNSDNxjkBow 文章目录 LoadRunner的简介与安装loadrunner概述loadrunner的下载与安装 LoadRunner的使用启用VuGen LoadRunner的简介与安装 LoadRunner官网&#xff1a;https://www.microfocus.com/zh-cn/products/load…

java面试题-Hashmap、Hashtable、ConcurrentHashMap原理

远离八股文&#xff0c;面试大白话&#xff0c;通俗且易懂 看完后试着用自己的话复述出来。有问题请指出&#xff0c;有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来&#xff0c;大家一起解决。 Hashmap和hashtable存储逻辑基本相同-都是基于hash表实现…

智能优化算法应用:基于水基湍流算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于水基湍流算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于水基湍流算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.水基湍流算法4.实验参数设定5.算法结果6.参考…

递增子序列(回溯)

题目描述 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一种特殊情况。 样例…

Unity使用打成图集的Sprite作为模型贴图使用的问题

大家好&#xff0c;我是阿赵。   有时候用Unity引擎做项目的时候&#xff0c;会遇到这样的需求&#xff0c;美术做了一些模型或者特效&#xff0c;然后策划想在游戏运行的时候&#xff0c;读取一些游戏图标放在特效或者模型上面当做贴图使用。   这个需求实现起来很简单&am…

手把手教你注册意大利商标

在当今全球商业环境中&#xff0c;拥有一个独特的商标可以为企业在市场竞争中提供重要优势。商标作为品牌形象的核心&#xff0c;有助于吸引潜在客户&#xff0c;提升品牌价值&#xff0c;增加客户忠诚度。在意大利&#xff0c;商标注册同样具有重要意义&#xff0c;它能为企业…

golang使用sip协议 用户名和密码注册到vos3000

在Go语言中&#xff0c;要使用SIP协议进行注册&#xff0c;您可以使用第三方库&#xff0c;如github.com/cloudwebrtc/sip。以下是一个简单的示例代码&#xff0c;演示如何使用Go语言中的该库进行基本的SIP注册&#xff1a; 首先&#xff0c;您需要安装该库&#xff1a; go ge…

销售人员如何自我提升?

销售人员如何自我提升&#xff1f; 在美国有这么一句流行语&#xff1a;不当总统就干销售员。其实在国内很多老板&#xff0c;高收入人群等大部分是来自销售岗位。因为销售是离钱最近的职业&#xff0c;在销售职业生涯中能收获到很多&#xff0c;比如人际关系能力&#xff0c;…

【刘二大人】pytorch深度学习实践(三):如何实现线性模型的反向传播+代码实现详解(Tensor、backward函数)

目录 参考资料一、反向传播流程1.1 问题1.2 方法1.3 步骤1.4 例题 二、Pytorch中前向传播和反馈的计算2.1 tensor数据类型2.2 定义线性模型并且计算损失2.2.1 torch.tensor.item()2.2.2 代码 2.3 反向传播2.3.1 torch.tensor.backward()2.3.2 tensor.zero_( )2.3.3 代码实现 三…

SASS基本语法总结

SASS是CSS预处理器&#xff0c;简单来说&#xff0c;SASS是比CSS更高一级的语言&#xff0c;它拥有CSS不具备的语法&#xff0c;比如if条件控制 SASS的预处理器 SASS是一种无法被浏览器直接执行的语言&#xff0c;我们需要通过预处理工具&#xff08;可以理解为翻译工具&…

SystemWeaver—电子电气系统协同研发平台

背景概述 当前电子电气系统在汽车领域应用广泛&#xff0c;其设计整合了多门工程学科&#xff0c;也因系统的复杂性、关联性日益提升&#xff0c;需要其提供面向软件、硬件、网络、电气等多领域交织而导致的复杂系统解决方案。并且随着功能安全、AUTOSAR、SOA、以太网通讯等新要…