新C++(4):模板

news2024/12/28 3:55:46

"抱紧你的我,比国王富有" 


C++可复用性高,C++引入了模板的概念,后面在此基础上,实现了方便开发的标准模板库STL

        -----前言

一、初始模板 

我们先来看看 下面的代码段;

如果此时又有需求: 交换一个char 类型的变量 ? 我们是不是又得费点时间 码字?

肯定不行! 未免太 麻烦了。 

(1)什么是模板?

 ​​​​​​

这是一个 各样的模子。 如果我们想把这个图形染成绿色 直接可以在模板上进行染色。

如果是想要鲜艳的红色, 直接可以在模板的基础上 浇筑红色颜料即可。 

还需要去 重新规划 形式 + 颜色吗? 答案是 不需要!

 C++的模板分为两类: 函数模板 +  类模板。

 我们现在就针对 这两种模板 入手。

(2)模板的使用 

①函数模板 


template<class T>
template<typename T>
//函数体 
void(T / T&) Func(T a1);
//注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

以此,我们也就 不用再多写一个" swap"  对char 类型单独进行特写。

②类模板 


那么模板函数类型 与 普通函数有什么区别呢? 两个是否可以同时存在? 编译器会怎样取舍?

那么此时我们如果非要使用模板的 情况,就需要 显示调用模板。 也就是第二次调用。         

(3)模板的原理 

了解的 函数模板的基本使用, 对于模板的原理 也有了一定的基础。

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

只有当模板进行实例化 (调用时)后 才会,生成具体的函数! 

由此,模板是不支持分离、编译的!

①模板类型 与 隐式类型转换

因为在"编译期间",当编译器看到该实例化时,需要推演T 接受的传参类型。

但模板参数列表中只有一个T,编译器无法确定此处到底该将T确定为int 或者 double类型而报错。

那如果不更变代码,如何进行使用呢? 

1.显示类型转换

2.用户自定义强转(隐式类型转换)

3.多类型参数(但与提问冲突)


二、模板进阶

(1)非类型模板参数

模板参数分类类型形参与非类型形参
类型形参:如前面的 class typename。

非类型形参:实质是一个被当做常量来使用。 

 如:C++中也有一个array的容器,也是用了这个非类型的模板参数,实现的是一个静态的数组。

注意:

        浮点数、类对象以及字符串是不允许作为非类型模板参数的。
        非类型的模板参数必须在编译期就能确认结果。

 

三、模板特化

        通常情况下,使用模板可以减少一些类型无关代码的编写,但是对于一些特殊类或类型,可能需要特殊的处理,才能达到我们想要的效果。

(1)函数模板化

1.必须要先有一个基础的函数模板.
2.关键字template后面接一对空的尖括号<>.
3.函数名后跟一对尖括号,尖括号中指定需要特化的类型.
4.函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误.

template<>
void Func<typname>(typename f1,typname f2)
{}

如我们所见,对于日期类,整型int可以得到正确的结果,

但是对比指针p1,p2时,结果却并不如我们所预。 其原因就在于,p1,p2分别是d1,d2的地址,他们比较的是地址的大小。

为此,我们实现的less模板仿函数,显然无法满足我们的需求。

除开用模板的特化解决外,我们仍然可以就使用一个普通函数,专门针对日期类地址的类型。当然这是利用编译器的机制,会优先调用不用进行推演的合适的函数。

bool Less(Date* left, Date* right)
{
    return *left < *right;
}

这下就可以用到我们的模板特化,问题由此得到解决! 


(2)类模板特化

①全特化

        全特化即是将模板参数列表中所有的参数都确定化;

②偏特化 

        任何针对模版参数进一步进行条件限制设计的特化版本;

部分特化;

类型的进一步限制;


总结:

①模板分为函数模板和类模板,模板参数分为类型参数和非类型模板参数(常量)

②模板不支持分离编译的根本原因在于:

        程序在连接时,会去找模板的地址进行链接,但是模板只会在实例化时,才生成具体的代码,而在编译阶段不会处理,也就生不成具体的代码。因此,链接就会报错。

③模板特化有函数模板特化和类模板特化。类模板特化值得注意的是:全特化与偏特化。偏特化即可以确定类型,也会限制类型。

本篇到此结束,感谢你的阅读。

祝你,向阳而生~

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

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

相关文章

数据库,计算机网络、操作系统刷题笔记29

数据库&#xff0c;计算机网络、操作系统刷题笔记29 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

联合证券|主力加仓电气设备、有色金属等行业

上证指数、深证成指早盘探底上升&#xff0c;午后震动回落&#xff0c;尾盘有所上升&#xff1b;创业板指早盘探底冲高&#xff0c;午后震动回落&#xff1b;科创50指数早盘高开高走&#xff0c;午后震动回落。到收盘&#xff0c;上证指数报3157.64点&#xff0c;涨0.08%&#…

如何在Windows中轻松扩大C盘?

因为C盘是系统盘&#xff0c;所以没有足够的空间会导致电脑变慢&#xff0c;影响程序或游戏的运行。新电脑C盘可能有足够的可用空间&#xff0c;但随着对电脑的使用&#xff0c;应用程序安装的越来越多。即便很多程序安装到D盘&#xff0c;但某些程序仍然会占用C盘的部分空间。…

Linux信号通信之信号

文章目录什么是信号生活中的信号进程的信号Linux信号种类前台进程和后台进程进程对信号的处理策略Linux产生信号的方式系统调用发送信号kill调用raise调用abortalarm通过终端按键产生信号通过软件条件产生信号信号的自定义处理signalsigactionCoredump函数重入可重入函数和不可…

Spire.Office 8.1.1 for .NET 是 Spire.Office 7.12.5吗

为何 Spire.Office for .net 8.1.1 悄悄而来&#xff1f;不得而知。官网没有更新信息&#xff0c;为何&#xff1f;我们都不清楚&#xff0c;但是都需要迎接它的到来&#xff0c;不管何种原因&#xff0c;接受吧 by Ω578867473 Spire.Office 7.12.5 is released Friday, 30 De…

持续交付-Jenkinsfile 语法

实现 Pipeline 功能的脚本语言叫做 Jenkinsfile&#xff0c;由 Groovy 语言实现。Jenkinsfile 一般是放在项目根目录&#xff0c;随项目一起受源代码管理软件控制&#xff0c;无需像创建"自由风格"项目一样&#xff0c;每次可能需要拷贝很多设置到新项目&#xff0c;…

openEuler委员会主席江大勇:激发原创力量,逐梦数智未来

12月29日&#xff0c;由欧拉开源社区发起并联合华为、麒麟软件、统信软件、麒麟信安、超聚变、英特尔、中科院软件所、软通动力、润和软件等伙伴&#xff0c;共同举办的openEuler Summit 2022于线上举行。 会上&#xff0c;openEuler委员会主席江大勇发表了《激发原创力量&…

PyQt学习笔记-基本窗体

记述PyQt的基本窗体信息和基本操作。一、主窗体类&#xff08;QMainWindow&#xff09;主窗体类是通用的主窗体&#xff0c;包含菜单栏&#xff08;QMenuBar&#xff09;&#xff0c;工具栏&#xff08;QToolBars&#xff09;&#xff0c;悬停部件&#xff08;QDockWidgets&…

国产之光Yakit——POC模拟神器

概要介绍Yakit 是一个高度集成化的 Yak 语言安全能力的安全测试平台&#xff0c;使用 Yakit&#xff0c;可以做到&#xff1a;类 Burpsuite 的 MITM 劫持操作台查看所有劫持到的请求的历史记录以及分析请求的参数全球第一个可视化的 Web 模糊测试工具&#xff1a;Web FuzzerYak…

前端项目-小米商城

首页的展示 首页的功能 1、搜索栏模糊查询 在我在输入框输入关键字的时候&#xff0c;会匹配关键字&#xff0c;如果我的存放的数据里面包含这些关机键字就会显示出来。做到模糊查询的效果。 2、实现搜索功能 在首页的搜索框点击搜索的时候&#xff0c;就会对你输入的关键字进…

VCSA证书过期处理

原创作者&#xff1a;运维工程师 谢晋 前提提要 客户环境为VSAN环境&#xff0c;VCSA版本为6.7&#xff0c;登陆VCSA时发现报错如下图&#xff1a;     经验判断该报错是因为VCSA的证书过期了&#xff0c;登陆VCSA的5480界面https://VCSAIP:5480&#xff0c;发现果然是证…

Java设计模式-建造者模式Builder

介绍 建造者模式&#xff08;Builder Pattern&#xff09; 又叫生成器模式&#xff0c;是一种对象构建模式。它可以 将复杂对象的建造过程抽象出来&#xff08;抽象类别&#xff09;&#xff0c;使这个抽象过程的不同实现方 法可以构造出不同表现&#xff08;属性&#xff09;的…

模拟实现list和vector反向迭代器

学习这部分知识&#xff0c;需要你了解vector和list的正向迭代器知识以及容器适配器知识&#xff0c;可以阅读我写的另外三篇vector、list、容器适配器 知识的博客&#xff01;其中list知识内容尤其重要且难度要求很高&#xff01; 反向迭代器&#xff0c;顾名思义是与正向迭代…

Mybatis整合Spring的事务控制与SqlSession线程安全问题

在Spring与Mybatis框架整合中&#xff0c;主要有两个重要改动&#xff0c;分别是事务与SqlSession。mybatis-spring包中为以上两个问题提供了解决方案。 重要组件 SpringManagedTransaction &#xff08;Spring事务管理器&#xff09;SqlSessionTemplate &#xff08;SqlSess…

新年快到了,教大家用汇编语言显示Happy New Year!

新年快到了&#xff0c;教大家用汇编来显示Happy New Year! 文章目录新年快到了&#xff0c;教大家用汇编来显示Happy New Year!汇编老矣&#xff0c;尚能饭否&#xff1f;特点效率底层显示字符安装环境编写代码内存地址空间显示格式代码编译连接运行总结大家都知道&#xff0c…

使用Docker搭建主从数据库(MySQL)

很多人对主从数据库有一个误区&#xff0c;把多个MySQL搭建在同一个服务器上&#xff0c;性能提升是不是很有限&#xff1f;这个理念是错误的&#xff0c;数据库的性能瓶颈主要是在IO和CPU负载过高&#xff0c;在同一台服务器运行多个数据库&#xff0c;能带来更低的延迟&#…

Java中atomic包中的原子操作类总结

1. 原子操作类介绍 在并发编程中很容易出现并发安全的问题&#xff0c;有一个很简单的例子就是多线程更新变量 i1,比如多个线程执行 i操作&#xff0c;就有可能获取不到正确的值&#xff0c;而这个问题&#xff0c;最常用的方法是通过 Synchronized 进行控制来达到线程安全的目…

【自学Python】Python复数(complex)

Python复数(complex) Python复数(complex)教程 Python 可以支持复数&#xff0c;复数的虚部用 j 或 J 来表示。如果需要在程序中对复数进行计算&#xff0c;需要导入 Python 的 cmath 模块&#xff0c;在该模块下包含了各种支持复数运算的函数。 案例 复数 定义 Python 中…

vim光速开发,你值得拥有

文章目录vim设计哲学vim的模式什么是可视模式光标移动动作(motion)操作符(operator)操作符&#xff08;operator&#xff09;动作&#xff08;motion&#xff09;实际使用大小写转换easymotionvim-surroundTIPSideavim的使用vim设计哲学 vim被称为编辑器之神。它的成名就是因为…

Python文档阅读笔记-Turn Images into Cartoons using Python

本博文说明如何将图片转为卡通风格。 1. 导入依赖模块 在编程的第一步首先要导入依赖库&#xff0c;在这个图像转换成卡通风格的程序中需要包含3个模块&#xff0c;分别是openCV&#xff0c;numpy&#xff0c;matpoltlib。 import cv2 import numpy as np import matplotlib.…