初次学习模板

模板

1、初识模板

我们设计交换函数,按照以往的写法,对于多类型的数据,可以设计成重载函数:

但是每一个类型都要写一个交换函数,工作量太大了。

能否实现一个通用的交换函数吗?答案是模板:

cpp 复制代码
//模板函数
template<typename T1, typename T2, ...>
(type) Func(T1& x, T2& y, ...)
{
	//...
}

2、模板函数

2.1、原理简单探索

我们利用上面的代码,分别实现交换int类型数据、double类型数据,调用的是同一个函数吗?

答案是不是调用同一个函数:

其实调用了两个函数。

模板通过传参行为,进行了类型推演,从而生成对应类型的函数代码。

这样一来,我们就将重复的工作交给了机器去做,从而提高了效率。

零碎知识:typename可以换成class,只是少数场景必须用typename。

2.2、实例化

函数模板的实例化,就是向模板传入不同的参数,模板按照参数类型推演出函数的参数类型,从而生成对应的函数的过程。

当然,不能传入不同类型的参数:

零碎知识:无需改变参数时,建议加上const。

如果硬要传入不同类型的参数,有两种方法。

隐式实例化

隐式实例化的办法,就是将不同类型的参数转换为同一类型的。

还有一种,显式实例化

显式实例化相当于指定了参数类型,不需要模板去推导。

那么显式实例化有什么有呢?

在这段代码中,由于模板参数列表中没有T类型的参数,导致编译器无法通过传入的参数来推导T的具体类型。

那么这时,显式实例化就派上了用场:

2.3、匹配原则

首先,通用加法函数(函数模板)与专门用作int的加法函数可以同时存在。

那么,传入int参数,调用哪一个函数呢?答案是专门用作int的加法函数:

道理很简单:有现成的就用现成的。没有就只能自己做(调用模板函数)。

2.4、指定调用模板的方法

当我们要求不能用现成的函数,必须调用模板(函数),怎么办?

一个方法是:显示实例化。

但是这样做,也会调用模板:

还是那个原因:选更匹配的。

这里可以理解为,T1被推演为int,T2被推演为double。

3、类模板

我们简单写一个类模板:

我们使用类模板去实例化出具体的类,必须显式实例化使用:

这是要求,更具有一种优势:我们不需要专门声明两种Stack,就可以实例化出存放不同类型的Stack对象。

4、模板实现的细节

1、模板不支持声明和定义分离到不同文件(.cpp、.h)
2、分离的定义必须重新声明类型的参数

3、模板参数可以给缺省值

当然,给缺省值也遵守"从右往左给缺省值"等规则。

相关推荐
啊啊啊啊啊!!!!5 小时前
【c++】stack和queue的接口使用以及底层实现
开发语言·c++
(Charon)8 小时前
【C++】锁与原子操作(四):自旋锁的完整实现与性能优化
c语言·开发语言·c++
ShineWinsu9 小时前
对于Linux:五种IO模型以及非阻塞IO的详细解析
linux·c++·面试·io·阻塞·非阻塞·fcntl
呜喵王阿尔萨斯10 小时前
extern “C“ in C++
c语言·c++·算法
乐观勇敢坚强的老彭10 小时前
C++信奥静态数组和动态数组
数据结构·c++·算法
gumichef10 小时前
第一章:面向对象核心——类和对象深度讲解
开发语言·c++
ao-weilai11 小时前
C++基础:类和对象
开发语言·c++
郝学胜-神的一滴11 小时前
[简化版 GAMES 104] 现代游戏引擎 04:从0到1构建你的游戏世界
c++·游戏·unity·游戏引擎·软件工程·unreal engine
Bryce学亮11 小时前
FileLine,基于 Qt 6 + QML 构建的跨平台文件传输与即时通讯工具
数据库·c++·人工智能·python·qt·github
旖旎夜光11 小时前
LeetCode 991: 坏了的计算器(贪心算法) —— 题解
数据结构·c++·算法·leetcode·贪心算法