【C++】模板(初识):函数模板、类模板

         本篇主要介绍C++中的模板初阶的一些知识。模板分为函数模板类模板,我们一个一个来看。

1.函数模板

1.1函数模板概念

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

1.2函数模板格式

template<class T1, class T2, ...>  (class/typename都行,<>里面是模板参数列表)

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

{}

关键字:template   class/typename(二者无区别,但是不能使用struct代替class)

比如我们现在要写一个两个数交换的函数 

//模板类型
template<class T>
void Swap(T& x, T& y)
{T tmp = x;x = y;y = tmp;
}

1.3 函数模板原理

我们在调用的时候就正常调用,编译器会帮助我们生成对应的函数。

int a = 1;
int b = 2;
cout << a << b << endl;
Swap(a, b);
cout << a << b << endl;

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

比如我们再交换double类型的试一下。

int a = 1, b = 2;
Swap(a, b);
double c = 1.1, d = 2.2;
Swap(c, d);

顺便说一句,C++其实提供了交换的函数,就是swap(),可以直接用

模板参数只有一个时,我们传参就必须传类型相同的,传不同类型的话这一个模板参数是不明确的,如果想传不同的就可以多加一个模板参数,如下

//两个模板参数T1,T2
template<typename T1, typename T2>
void Swap(T1& x, T2& y)
{T tmp = x;x = y;y = tmp;
}

int a = 1, b = 2;
Swap(a, b);
double c = 1.1, d = 2.2;
Swap(c, d); //可传相同类型 Swap(a, c); //可传不同类型

记住!我们调用的不是模板,而是模板通过对参数类型的推理而生成的函数

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

1.4函数模板的实例化

用函数模板生成对应的函数,就是模板的实例化

//模板实例化
template<class T> 
T Add(const T& left, const T& right)
{return left + right;
}

前面我们说到过,如果只有一个模板参数,调用函数传参时,要传一样类型的参数,如果这里非要传不同类型的参数,就有下面几种解决方式:

int a = 1, b = 2;
double c = 1.1, d = 2.2;

第一种,强制类型转换。这种方法叫做推导实例化。 

Add(a, (int)c);    //都为int
Add((double)a, c); //都为double

这种方法就是让编译器自己去推导T的类型。

第二种,显示实例化。在函数名和参数中间加上<>,<>里面写类型。

//显式实例化
Add<int>(a, c);
Add<double>(a, c);

这里的意思就是,我们不通过模板自己推导得出参数类型,我们直接给定T的类型了。

第三种,定义多个模板参数。前面提到过。

template<class T1, class T2> 
T1 Add(const T1& left, const T2& right)//返回值类型想给什么就给什么
{return left + right;
}

如果想对这种有多个模板参数的显式实例化,也是在在<>里写类型,逗号分隔。

//显式实例化
Add<int, double>(a, c);
Add<double, int>(a, c);

有些地方必须要用显式实例化,比如下面这个代码。

template<class T>
T* func(int a)
{return new T[n];
}
int main()
{func(10);//错误示范return 0;
}

这里模板推导不出来T到底什么类型,所以必须显式实例化,比如说我们想要int类型的。

int main()
{int* p = func<int>(10);return 0;
}

1.5 模板参数的匹配原则

1. 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这 个非模板函数
2. 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而 不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模
3. 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

 2.类模板

2.1 类模板的定义格式

template<class T1, class T2, ..., class Tn> (也可以用typename)

class 类模板名

{

        //类内成员定义
}

 比如说我们写一个栈Stack的一部分。

template<class T>
class Stack
{
public:Stack(int n = 4) //构造:_arr(new T[n]),_size(0),_capacity(n){}~Stack() //析构{delete[] _arr;_arr = nullptr;_size = _capacity = 0;}void Push(const T& x){}private:T* _arr;int _size;int _capacity;
};

这里的Push压栈时,空间不够我们要扩容,扩容怎么写?

直接手动扩容,不用realloc那些函数了。 步骤如下。

void Push(const T& x)
{if (_size == _capacity)//当空间不够时{T* tmp = new T[_capacity * 2]; //手动扩容memcpy(tmp, _arr, sizeof(T) * _size); //原数据拷贝到新空间delet[] _arr; //释放旧空间_arr = tmp; //指向新空间_capacity *= 2; //更新空间大小数据}_arr[_size++] = x; //入栈}

 

2.2 类模板的实例化

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的
类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类
比如上面的Stack,模板在这里其实很像c语言中的typedef,但是C语言实现栈,一个栈只能实现一种数据的存放,模板就能实现不同类型的栈。
Stack<int> s1;    //int
Stack<double> s2; //double

类模板都是显式实例化,模板推导不出来T的类型。

Stack是类名,Stack<int>才是类型给不同的模板实例化,就是不同的类型。

本篇分享就到这里,拜拜~

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

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

相关文章

人工智能平台 PAI-DSW内置通义灵码实操

人工智能平台 PAI&#xff08;Platform for AI&#xff0c;原机器学习平台PAI&#xff09;是 AI Native 的大模型与 AIGC 工程平台&#xff0c;提供包含数据集管理、算力管理、模型工具链、模型开发、模型训练、模型部署、AI资产管理在内的功能模块&#xff0c;内置100种大模型…

JVS·智能BI数据可视化图表:普通列表与分组列表配置全解析

使用场景 在可视化配置中&#xff0c;很多场景中需要图形和详细信息的融合展示&#xff0c;那么在图表中可以新增普通列表与分组列表的配置。如下图所示&#xff1a; 配置说明 1、新增组件&#xff1a;配置入口如下图所示&#xff0c;新增组件时&#xff0c;选择普通列表与分…

前端vue-配置请求拦截器

1.配置拦截器&#xff0c;记得20行的导出 2.响应拦截器&#xff0c;记得28行的导出 3.拦截器不止可以拦截&#xff0c;还可以添加内容

Custom C++ and CUDA Extensions - PyTorch

0. Abstract 经历了一波 pybind11 和 CUDA 编程 的学习, 接下来看一看 PyTorch 官方给的 C/CUDA 扩展的教程. 发现极其简单, 就是直接用 setuptools 导出 PyTorch C 版代码的 Python 接口就可以了. 所以, 本博客包含以下内容: LibTorch 初步;C Extension 例子; 1. LibTorch …

CSS3--美若天仙!?

免责声明&#xff1a;本文仅做分享~ 目录 CSS引入方式 选择器 盒子尺寸和背景色 文字控制属性 单行文字 垂直居中 字体族 font复合属性 文本对齐方式 文本修饰线 color 文字颜色 ----- 复合选择器 伪类选择器 超链接伪类 CSS特性 继承性 层叠性 优先级 Emmet …

H、Happy Number(2024牛客国庆集训派对day7)

题目链接&#xff1a; H-Happy Number_2024牛客国庆集训派对day7 (nowcoder.com) 题目描述&#xff1a; 翻译为中文&#xff1a; 数据范围&#xff1a; 输入样例&#xff1a; 680 输出样例&#xff1a; 326623 分析: 本来以为是dfs&#xff0c;但是看到数据范围1e9, 联想到是…

通信工程学习:什么是三网融合

三网融合 三网融合&#xff0c;又称“三网合一”&#xff0c;是指电信网、广播电视网、互联网在高层业务应用上的深度融合。这一概念在近年来随着信息技术的快速发展而逐渐受到重视&#xff0c;并成为推动信息化社会建设的重要力量。以下是对三网融合的详细解释&#xff1a; 一…

扩展、包含、泛化-系统架构师(七十七)

1&#xff08;&#xff09;是系统分析阶段结束后得到的工作产品&#xff0c;&#xff08;&#xff09;是系统测试阶段完成后的工作产品。 问题1 A系统设计规格说明 B系统方案建议书 C系统规格说明 D单元测试数据 问题2 A验收测试计划 B测试标准 C系统测试计划 D操作手…

社团活动助手系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;活动分类管理&#xff0c;用户管理&#xff0c;社团活动管理&#xff0c;报名信息管理&#xff0c;签到登记管理&#xff0c;投票项目管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首…

四款语音转文字神器,一键搞定会议记录!

嘿&#xff0c;朋友们&#xff0c;今天咱们来聊聊那些语音转文字的免费软件吧&#xff01;在这个快节奏的时代&#xff0c;谁不想省点时间&#xff0c;少敲几下键盘呢&#xff1f;尤其是那些开会、采访或者闲聊时&#xff0c;语音消息满天飞的日子&#xff0c;一个好用的语音转…

【业务场景】最全的购物车设计与实现

前言 博主最近在做一个购物商城&#xff0c;正好设计到购物车模块&#xff0c;于是乎全面的来聊一聊购物车模块实现的一些核心要点吧&#xff0c;很值得反复品味的设计&#xff0c;当需要实现购物车的时候&#xff0c;本文应该拿来就能用。 目录 1.需要解决的核心问题清单 2…

Mybatis-plus做了什么

Mybatis-plus做了什么 Mybatis回顾以前的方案Mybatis-plus 合集总览&#xff1a;Mybatis框架梳理 聊一下mybatis-plus。你是否有过疑问&#xff0c;Mybatis-plus中BaseMapper方法对应的SQL在哪里&#xff1f;它为啥会被越来越多人接受。在Mybatis已经足够灵活的情况下&…

22.第二阶段x86游戏实战2-背包遍历REP指令详解

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

【Java 并发编程】多线程安全问题(上)

前言 虽然并发编程让我们的 CPU 核心能够得到充分的使用&#xff0c;程序运行效率更高效。但是也会引发一些问题。比如当进程中有多个并发线程进入一个重要数据的代码块时&#xff0c;在修改数据的过程中&#xff0c;很有可能引发线程安全问题&#xff0c;从而造成数据异常。 p…

免费 Oracle 各版本 离线帮助使用和介绍

文章目录 Oracle 各版本 离线帮助使用和介绍概要在线帮助下载离线文档包&#xff1a;解压离线文档&#xff1a;访问离线文档&#xff1a;导航使用&#xff1a;目录介绍Install and Upgrade&#xff08;安装和升级&#xff09;&#xff1a;Administration&#xff08;管理&#…

做无货源反向代购业务需要的代购系统功能需求讲解(一):商品数据接入

在电子商务领域&#xff0c;无货源反向代购业务逐渐崭露头角&#xff0c;成为许多创业者和中小企业拓展市场的新途径。这种业务模式的核心在于通过代购平台&#xff0c;将国外或特定地区的商品信息展示给国内消费者&#xff0c;并在消费者下单后&#xff0c;由代购方进行采购、…

成都睿明智科技有限公司真实可靠吗?

在这个日新月异的电商时代&#xff0c;抖音作为短视频与直播电商的佼佼者&#xff0c;正以前所未有的速度重塑着消费者的购物习惯。而在这片充满机遇与挑战的蓝海中&#xff0c;成都睿明智科技有限公司以其独到的眼光和专业的服务&#xff0c;成为了众多商家信赖的合作伙伴。今…

【万字长文】Word2Vec计算详解(一)

【万字长文】Word2Vec计算详解&#xff08;一&#xff09; 写在前面 本文用于记录本人学习NLP过程中&#xff0c;学习Word2Vec部分时的详细过程&#xff0c;本文与本人写的其他文章一样&#xff0c;旨在给出Word2Vec模型中的详细计算过程&#xff0c;包括每个模块的计算过程&a…

Ubuntu-24.10无法安装Sunlogin-15.2的解决方案

目录 1. 报错信息2. 解决方案3. dpkg-deb命令帮助4. References 1. 报错信息 albertqeeZBG7W:/opt/albertqee/Downloads$ ls | egrep -i sun SunloginClient_11.0.1.44968_amd64.deb SunloginClient_15.2.0.63062_amd64.deb SunloginClient_15.2.0.63064_amd64.deb albertqeeZ…

JavaScript函数基础(通俗易懂篇)

10.函数 10.1 函数的基础知识 为什么会有函数&#xff1f; 在写代码的时候&#xff0c;有一些常用的代码需要书写很多次&#xff0c;如果直接复制粘贴的话&#xff0c;会造成大量的代码冗余&#xff1b; 函数可以封装一段重复的javascript代码&#xff0c;它只需要声明一次&a…