C++ —— 关于模板初阶

news2024/9/23 6:12:45

1.什么是模板

在C++中,模板(template)是一种通用的编程工具,允许程序员编写通用代码以处理多种数据型或数据结构,而不需要为每种特定类型编写重复的代码,通过模板,可以实现代码的复用和泛化提高代码的灵活性和可维护性———简而言之就是可以写一份通用的模板,便于阅读和管理

模板是不能调用的,只能生成对应的函数

比如下面这段代码传统情况下需要写多个重复类似的代码:

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;
    }

而我们有一个模板的话就可以很好的解决:

template<typename T>
void Swap( T& left,  T& right)
    {
        T temp = left;
        left = right;
        right = temp;
    }

而模板又分为函数模板和类模板:

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

 


2.函数模板 

2.1 函数模板概念

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



2.2 函数模板格式


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

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

如:

template<typename T>
void Swap( T& left,  T& right)
    {
        T temp = left;
        left = right;
        right = temp;
    }

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

template<typename T1 , class T2>
void Swap( T& left,  T& right)
    {
        
    }

定义模板关键字也可以同时有typename和class俩个关键字,这样写并没有问题,但是并不建议这样写,最好还是俩个关键字相同


2.3 函数模板的原理

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。
所以其实模板就是将本来应该我们做的重复的事情交给了编译器

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此

 


2.4 函数模板的实例化

int a1 = 10, a2 = 20;
double d1 = 10.0, d2 = 20.0;
Add(a1, d2);
Add(d1, a2);

上面这段代码是不能通过的,如果我们想解决的话可以进行强制类型转换

int a1 = 10, a2 = 20;
double d1 = 10.0, d2 = 20.0;
Add(a1, (int)d2);
Add(d1, (double)a2);

除了这个方法之外我们还可以使用显示实例化来解决这个问题 

用函数模板生成对应的函数叫做模板的实例化

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

1. 隐式实例化:让编译器根据实参推演模板参数的实际类型

template<class T>
T Add(const T& left, const T& right)
    {
       return left + right;
    }
int main()
    {
       int a1 = 10, a2 = 20;
       double d1 = 10.0, d2 = 20.0;
       Add(a1, a2);
       Add(d1, d2);
       Add(a, (int)d);
       return 0;
    }

此时有两种处理方式:1. 用户自己来强制转化 2. 使用显式实例化

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

int main(void)
    {
       int a = 10;
       double b = 20.0;
   
       // 显式实例化
       Add<int>(a, b);
       return 0;
    }

如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错


2.5 模板参数的匹配原则

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

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

// 代码1
 int Add(int left, int right)
{
     return left + right;
}
 
 // 代码2
 template<class T>
 T Add(T left, T right)
{
     return left + right;
}
 
 void Test()
{
     Add(1, 2);      
     Add<int>(1, 2);  
}

 上面这段代码如果使用起来会优先调用代码1,因为代码2还需要进行二次加工

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


3. 类模板


3.1 类模板的定义格式

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

3.2 类模板的实例化

类模板都是显示实例化

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

// Stack是类名,Stack<int>才是类型
Stack<int> st1;    // int
Stack<double> st2; // double

感谢观看~        

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

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

相关文章

Python GUI Maker:拖拽式生成Tkinter GUI 界面的设计工具,让Tkinter开发变得专业高效

简介 Python 是一门极其流行和强大的编程语言,其简洁优雅的语法以及丰富的标准库和第三方库,使其在各个领域都广受欢迎。其中,Tkinter 是 Python 内置的图形用户界面(GUI)库,是构建 Python GUI 应用程序的事实标准。Tkinter 提供了创建窗口、添加控件、处理事件等基本功能,但对…

SQL 简单查询

目录 一、投影查询 1、指定特定列查询 2、修改返回列名查询 3、计算值查询 二、选择查询 1、使用关系表达式 2、使用逻辑表达式 3、使用 BETWEEN关键字 4、使用 IN关键字 5、使用 LIKE关键字 6、使用 IS NULL/ NOT NULL关键字 7、符合条件查询 三、聚合函数查询 一…

深度学习 —— 个人学习笔记6(权重衰减)

声明 本文章为个人学习使用&#xff0c;版面观感若有不适请谅解&#xff0c;文中知识仅代表个人观点&#xff0c;若出现错误&#xff0c;欢迎各位批评指正。 十三、权重衰减 使用以下公式为例做演示&#xff1a; y 0.05 ∑ i 1 d 0.01 x i ε w h e r e ε &#xff5e; N…

勇闯高龄“禁区”,四川眼科医院成功为95岁高龄老人实施泪道手术

一吹风就流泪、眼角总有擦不干净的分泌物……很多人以为这只是个滴眼药就能解决的小问题。其实不然&#xff0c;“不起眼”的疾病发展严重时可能还会需要手术治疗。 近日&#xff0c;四川眼科接诊了一位眼泪汪汪的耄耋老人张奶奶&#xff08;化名&#xff09;&#xff0c;此次…

vue2 使用代码编辑器插件 vue-codemirror

vue 使用代码编辑器插件 vue-codemirror 之前用过一次&#xff0c;当时用的一知半解的&#xff0c;所以也没有成文&#xff0c;前几天又因为项目有需求&#xff0c;所以说有用了一次&#xff0c;当然&#xff0c;依旧是一知半解&#xff0c;但是还是稍微写一下子吧&#xff01;…

学习测试10-4自动化 web自动化

网页资源 链接: https://pan.baidu.com/s/17XL2c2lkw_R6BD–VnOQqw?pwd43dr 提取码: 43dr 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 框架之间切换 driver.switch_to.frame("idframe1") # 父切子 参数用id和name# 子切子必须先转回父 driver.sw…

数据分析:微生物数据的荟萃分析框架

介绍 Meta-analysis of fecal metagenomes reveals global microbial signatures that are specific for colorectal cancer提供了一种荟萃分析的框架&#xff0c;它主要基于常用的Wilcoxon rank-sum test和Blocked Wilcoxon rank-sum test 方法计算显著性&#xff0c;再使用分…

STM32自己从零开始实操10:PCB全过程

一、PCB总体分布 分布主要参考有&#xff1a; 方便供电布线。方便布信号线。方便接口。人体工学。 以下只能让大家看到各个模块大致分布在板子的哪一块&#xff0c;只能说每个人画都有自己的理由&#xff0c;我的理由如下。 还有很多没有表达出来的东西&#xff0c;我也不知…

Python和MATLAB网络尺度结构和幂律度大型图生成式模型算法

&#x1f3af;要点 &#x1f3af;算法随机图模型数学概率 | &#x1f3af;图预期度序列数学定义 | &#x1f3af;生成具有任意指数的大型幂律网络&#xff0c;数学计算幂律指数和平均度 | &#x1f3af;随机图分析中巨型连接分量数学理论和推论 | &#x1f3af;生成式多层网络…

如何解决Windows系统目录权限问题

目录 前言1. 为什么会出现权限问题2. 修改文件权限的步骤2.1 确定目标文件2.2 右键属性设置2.3 更改所有者2.4 修改权限2.5 确认修改 3. 替换文件3.1 拷贝新的文件3.2 验证替换结果 结语 前言 在Windows系统中&#xff0c;时常需要往C盘系统目录下拷贝或者替换文件。然而&…

【Python系列】JSON 序列化性能对比分析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【学术会议征稿】第五届计算机工程与智能通信国际研讨会(ISCEIC 2024)

第五届计算机工程与智能通信国际研讨会&#xff08;ISCEIC 2024&#xff09; 2024 5th International Symposium on Computer Engineering and Intelligent Communications (ISCEIC 2024) 第五届计算机工程与智能通信国际研讨会&#xff08;ISCEIC 2024&#xff09;将于2024年…

安全管理(EHS系统)是什么?化工企业如何进行安全管理?

化工企业一般会涉及到易燃易爆、有毒有害的原材料和产品&#xff0c;生产环境有高温高压、腐蚀性强等危险因素。一旦管理不善或操作失误&#xff0c;极易引发火灾、爆炸、中毒等严重事故&#xff0c;不仅有人身伤害&#xff0c;还会给企业带来巨大损失&#xff0c;甚至影响社会…

如何快速批量修改照片拍摄日期?一键批量搞定拍摄日期修改教程

在摄影爱好者、专业摄影师甚至普通用户中&#xff0c;照片不仅仅是视觉记录&#xff0c;它们还承载着时间和地点的印记。当需要调整大量照片的拍摄日期时&#xff0c;手动操作显然不是最高效的方法。幸运的是&#xff0c;现代文件管理工具如“简鹿文件批量重命名”软件提供了批…

数据隐私保护与区块链技术的结合:新兴趋势分析

在当今数字化时代&#xff0c;数据隐私保护成为了一个备受关注的重要话题。随着个人数据的不断生成和流通&#xff0c;如何有效保护用户的隐私成为了技术创新的一个重要方向。区块链技术作为一种去中心化、安全性高且可追溯的技术手段&#xff0c;正在逐渐成为解决数据隐私保护…

Android --- 广播

广播是什么&#xff1f; 一种相互通信&#xff0c;传递信息的机制&#xff0c;组件内、进程间&#xff08;App之间&#xff09; 如何使用广播&#xff1f; 组成部分 发送者-发送广播 与启动其他四大组件一样&#xff0c;广播发送也是使用intent发送。 设置action&#xff…

RoundCube搭建安装教程:服务器配置方法?

RoundCube搭建安装教程的疑问解析&#xff01;怎么搭建邮件系统&#xff1f; RoundCube是一款开源的Web邮件客户端&#xff0c;具有现代化的用户界面和丰富的功能&#xff0c;可以通过浏览器访问邮件服务器。AokSend将详细介绍如何在服务器上配置和安装RoundCube&#xff0c;以…

JS语法学习

找到官方库&#xff0c;查看相应资料&#xff1a;&#xff08;都可以切换为中文版本的&#xff09; 可以在 JavaScript 的官方网站上查看最新的语法规范和文档。JavaScript 的官方网站是 developer.mozilla.orghttps://developer.mozilla.org/en-US/docs/Web/JavaScript。那里…

尚庭公寓开发笔记(一)

本篇文章讲的是p前五十节课 可以关注后续 传统的数据库设计流程 分为三个阶段&#xff1a;概念模型设计阶段 逻辑模型设计阶段 物理模型设计 阶段 为本项目设计数据库模型 地图的存储只需要保存经纬度就ok 本项目采用的是mysql数据库 所有表都使用的是innnodb存储引擎 我们使…

数据编织 VS 数据仓库 VS 数据湖

目录 1. 什么是数据编织?2. 数据编织的工作原理3. 代码示例4. 数据编织的优势5. 应用场景6. 数据编织 vs 数据仓库6.1 数据存储方式6.2 数据更新和实时性6.3 灵活性和可扩展性6.4 查询性能6.5 数据治理和一致性6.6 适用场景6.7 代码示例比较 7. 数据编织 vs 数据湖7.1 数据存储…