C++——模板详解

news2024/11/15 21:54:16

目录

模板

函数模板

显示实例化

类模板

模板特点


模板

        模板,就是把一个本来只能对特定类型实现的代码,变成一个模板类型,这个模板类型能转换为任何内置类型,从而让程序员只需要实现一个模板,就能对不同的数据进行操作。模板分为函数模板类模板

        模板使用格式:template<typename T1, typename T2,......,typename Tn>;也可以为:template<class T1, class T2,......,class Tn>

函数模板

        函数模板,就是用模板来实现一个函数,从而让这个函数可以供任何内置类型使用,例如下图:

        我们定义T为模板,那么T就可以为任何内置类型,当传入不同类型时,编译器都会自动对应上。当然下面swap(a,b)和swap(c,d)也不是同个swap函数,而是编译器根据我们形参的类型,从而把T转换为形参的类型,然后生成一个swap函数。图中代码会生成一个形参是int类型的函数和一个形参是double类型的函数。

        编译器根据我们给的类型,在根据函数模板,生成对应类型的函数;这个过程叫模板的实例化

        如果swap的两个传参不是同个传参,但函数模板里是同个模板T,就会无法编译;这时候只能用显示实例化来强行让两个传参为显示实例化的类型。

显示实例化

        进行模板实例化时,还可以显示实例化。即使用模板函数的时候,强制后面的形参为我们所要求的类型。使用方法为:函数模板名<类型>(对象1,对象2....);强制让对象1和对象2为前面<>内输入的类型。

        比如下图,直接用add(a,b)是编译不过的,但用了显示实例化就可以强行让a和b都为int类型,再生成一个int类型的add函数,进行调用。

类模板

        类模板,就是把模板的类型放入类中,这样在我们类的对象实例化的时候,就可以自主选择需要创建的对象的类型。

        注意:类模板创建对象时必须进行显示实例化

        类模板不能声明定义分离到两个文件,在一个文件内进行声明定义分离时,定义部分要包含域和模板类型,而且在定义的上方要在声明一次模板。(因为上面声明的模板,是在class内使用,下面再次声明的模板是在函数内使用)具体使用方式如下图所示:

模板特点

        模板不能声明定义分离。

        模板只能定义一行使用一行,当模板被使用于函数或者中后,不能再放入其他函数或者类中。

        当模板名字和我们自己定义的函数名冲突时,不会报错;当我们调用函数时,编译器会先找有没有形参对应上的非模板函数,找不到才会实例化模板。但如果使用了显示实例化则会强制调用模板,进行模板实例化。  

        模板函数不允许自动类型转换,如果类型不同,则编译不了,只能用显示实例化;但普通函数可以进行自动类型转换。

        模板可以具有非类型参数,用于指定大小,可以根据指定的大小创建动态结构,所以模板可以用来创建动态增大或减小的数据结构

        模板运行时不检查数据类型相当于类型的宏替换,不保证安全。

        类模板是一个类家族,模板类是通过类模板实例化的具体类。

        C++中类模板的声明格式为template<模板形参表声明><类声明>,并且类模板的成员函数都是模板函数。

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

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

相关文章

2024年 前端JavaScript Web APIs 第二天 笔记

Web APIs 第二天 2.1 -事件监听以及案例 2.2 -随机点名案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…

Git分布式版本控制系统——git学习准备工作

一、Git仓库介绍 开发者可以通过Git仓库来存储和管理文件代码&#xff0c;Git仓库分为两种&#xff1a; 本地仓库&#xff1a;开发人员自己电脑上的Git仓库 远程仓库&#xff1a;远程服务器上的Git仓库 仓库之间的运转如下图&#xff1a; commit&#xff1a;提交&#xff…

Pytorch 复习总结 4

Pytorch 复习总结&#xff0c;仅供笔者使用&#xff0c;参考教材&#xff1a; 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为&#xff1a;Pytorch 深度学习计算。 本文先介绍了深度学习中自定义层和块的方法&#xff0c;然后介绍了一些…

Doccano 修复 spacy.gold 的bug

引言 最初只是想把Doccano标注的数据集转换成BIO(类似conll2003数据集)的标注格式&#xff1b; 按照PR的修改意见实现了修改&#xff0c;但是本人不建议这么做&#xff1b; 应该随着Doccano的升级&#xff0c;Doccano的导出格式发生了变化&#xff0c;而原来的doccano-transfo…

正确认识肠道内脆弱拟杆菌——其在健康的阴暗面和光明面

谷禾健康 脆弱拟杆菌(Bacteroides fragilis)是拟杆菌门拟杆菌属的重要成员。事实上&#xff0c;脆弱拟杆菌因其免疫调节功能而成为该属中研究最多的共生微生物。它是革兰氏阴性、不形成孢子、杆状专性厌氧菌。在人类健康中扮演着复杂而双面的角色。 这种革兰氏阴性专性厌氧菌常…

架构设计方法(4A架构)-信息架构

1、 信息架构&#xff08;IA&#xff09;&#xff1a;现实事物在IT世界的建模体现 2、数据资产目录 3、 识别业务对象&#xff1a;业务对象的设计方法 设计方法 1.基于业务流程识别业务活动。 2. 识别业务流程中每个业务活动的输入、输出等BI&#xff08;Business Item&#…

Zabbix企业运维监控工具

Zabbix企业级监控方案 常见监控软件介绍 Cacti Cacti是一套基于 PHP、MySQL、SNMP 及 RRD Tool 开发的监测图形分析工具&#xff0c;Cacti 是使用轮询的方式由主服务器向设备发送数据请求来获取设备上状态数据信息的,如果设备不断增多,这个轮询的过程就非常的耗时&#xff0…

SpringBoot源码解读与原理分析(三十七)SpringBoot整合WebMvc(二)DispatcherServlet的工作全流程

文章目录 前言12.4 DispatcherServlet的工作全流程12.4.1 DispatcherServlet#service12.4.2 processRequest12.4.3 doService12.4.3.1 isIncludeRequest的判断12.4.3.2 FlashMapManager的设计 12.4.4 doDispatch12.4.4.1 处理文件上传请求12.4.4.2 获取可用的Handler&#xff0…

Vue+SpringBoot打造农村物流配送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理&#xff1a;2.2.2 位置信息管理&#xff1a;2.2.3 配送人员分配&#xff1a;2.2.4 路线规划&#xff1a;2.2.5 个人中心&#xff1a;2.2.6 退换快递处理&#xff1a;…

5G时代对于工业化场景应用有什么改善

5G 不仅仅是 4G 的技术升级&#xff0c;而是将平板电脑和智能手机的技术升级。除了更好的高清视频流和其他高带宽应用&#xff0c;消费者不会注意到很多性能差异。然而&#xff0c;在工业领域&#xff0c;5G 代表着巨大的飞跃。 在工厂和厂房内&#xff0c; 设备的Wi-Fi 网络经…

低功耗运放D722,具有9MHz的高增益带宽积,转换速率为8.5V/μs

D722是低噪声、低电压、低功耗运放&#xff0c;应用广泛。D722具有9MHz的高增益带宽积&#xff0c;转换速率为8.5V/μs&#xff0c;静态电流为1.7mA&#xff08;5V电源电压&#xff09;。D722具有低电压、低噪声的特点&#xff0c;并提供轨到轨输出能力&#xff0c;D722的最大输…

本地maven库缓存导入私库

为了加速编译代码&#xff0c;想将本地maven缓存导入内网私库使用。 脚本网上搜的 #!/bin/bash # copy and run this script to the root of the repository directory containing files # this script attempts to exclude uploading itself explicitly so the script name …

C++指针(二)

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 文章目录 1.数组指针 1.1数组指针的概念 1.2数组指针的用处 1.3数组指针的操作 1.4二维数组如何访问 1.5数组指针访问流程 1.6数组指针的练习题 2.指针数组 2.1指针数组的概念 2.2指针数组的用处 2…

AMEYA360:航顺车规级MCU HK32AUTO39A的汽车侧滑门控制方案

汽车滑门因侧开启方式与传统车门相比&#xff0c;具有易泊车、开启宽度大和方便乘员货物进出的优点&#xff0c;很受消费者的青睐。汽车市场上&#xff0c;无论是面向高端的商务豪华MPV&#xff0c;还是面向城市物流的轻型客车和低端客运微型车都采用了汽车机械滑门系统。 汽车…

韦东山嵌入式Liunx入门驱动开发三

文章目录 一、GPIO和Pinctrl子系统的使用1-1 Pinctrl子系统1-2 GPIO子系统1-3 基于GPIO子系统的LED驱动程序 本人学习完韦老师的视频&#xff0c;因此来复习巩固&#xff0c;写以笔记记之。 韦老师的课比较难&#xff0c;第一遍不知道在说什么&#xff0c;但是坚持看完一遍&…

死记硬背spring bean 的生命周期

1.bean的生命周期 我们平常经常使用类似于new Object()的方式去创建对象&#xff0c;在这个对象没有任何引用的时候&#xff0c;会被gc给回收掉。而对于spring而言&#xff0c;它本身存在一个Ioc容器&#xff0c;就是用来管理对象的&#xff0c;而对象的生命周期也完全由这个容…

为什么软考报名人数越来越多?

2020年软考报名人数404666人&#xff0c;广东省报考人数超过14万人。 ●2021年软考通信考试报名人数突破100万人&#xff0c;估计软考有90多万。 ●2022年软考通信考试共129万人&#xff0c;估计软考占了120多万人。 ●2023年软考具体报名人数没有公布&#xff0c;但工业和信…

three 层级模型

group.remove(mesh1,mesh2);Vector3与模型位置、缩放属性 Group层级模型(树结构) 创建了两个网格模型mesh1、mesh2&#xff0c;通过THREE.Group类创建一个组对象group,然后通过add方法把网格模型mesh1、mesh2作为设置为组对象group的子对象&#xff0c;然后在通过执行scene.a…

ETL数据仓库的使用方式

一、ETL的过程 在 ETL 过程中&#xff0c;数据从源系统中抽取&#xff08;Extract&#xff09;&#xff0c;经过各种转换&#xff08;Transform&#xff09;操作&#xff0c;最后加载&#xff08;Load&#xff09;到目标数据仓库中。以下是 ETL 数仓流程的基本步骤&#xff1a…

猫为什么挑食?改善挑食的主食冻干推荐

现代养猫人士往往把自家的小猫看作是生活中的小宝贝&#xff0c;十分宠爱。然而&#xff0c;这种宠爱有时也会导致猫咪养成挑食的不良习惯。那么&#xff0c;猫为什么挑食&#xff1f;当猫咪拒绝吃猫粮时&#xff0c;我们应该如何应对呢&#xff1f; 今天&#xff0c;我要分享一…