lesson05-C++模板

个人主页:Lei宝啊 

愿所有美好如期而遇


目录

泛型编程

函数模板

类模板


泛型编程

我们先看一个代码:

看着是不是有点麻烦,我们有没有一种通用的办法,让编译器能够根据不同的类型自动生成不同的函数呢?有,就是模板。

泛型编程:

编写与类型无关的通用代码,是代码复用的一种手段。

而模板是泛型编程的基础 

函数模板

我们先看代码:

template<typename T>
void Swap(T& a, T& b)
{
	T tmep = a;
	a = b;
	b = temp;
}

函数模板概念 :

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

我们以上面代码为例讲解:

首先,函数模板的格式:

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

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

template 的意思就是模板。

typename是用来定义模板参数的关键字,也可以用class替代,但不可以使用struct。

T1,T2等就是编译器自己根据实参类型推导出来的,或者由我们显式实例化(后面说)。

 接下来我们进行各种可能的实验。

错误原因是,编译器通过实参a将T推导为int类型,通过实参e将T推导为double类型,但是只有一个T,编译器无法确定他是int还是double,就会报错。

template<class T1, class T2>
void Swap(T1& a, T2& b)
{
	double temp = a;
	a = b;
	b = temp;
}

多了这样一个重载就没问题了,因为我们多了一个模板参数,则T1推导为int,T2推导为double。

换成Add函数还有另一种解决办法:强制类型转换

template<class T>
T Add(T& a, T& b)
{
	return a + b;
}

但是这里涉及引用的隐式类型转换,参照:C++入门,目录-引用,所以我们的Swap函数需要变点东西:

template<class T>
T Add(const T& a,const T& b)
{
	return a + b;
}

ret结果为4。

去掉const,就会出现权限放大的问题,在e强制类型转换时产生临时变量,具有常性,而函数的参数是变量,就会报错。

还有一种解决办法,叫做显式实例化

我们指定模板的模板参数,叫做显式实例化,编译器自己推导,叫做隐式实例化。

模板参数的匹配规则: 

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

#include <iostream>
using namespace std;

int add(int a, int b)
{
	return a + b;
}

template<class T>
T add(T a, T b)
{
	return a + b;
}

int main()
{
	
	add(1, 2);
	add<int>(1, 2);

	return 0;
}

对于非模板函数和同名函数模板,如果调用函数时传参与非模板函数完全相同,那么就优先调用非模板函数,而不是调用函数模板实例化出来的函数;如果模板可以产生一个具有更好匹配的函数,那么将选择模板去实例化函数。

#include <iostream>
using namespace std;

int Add(int a, int b)
{
	return a + b;
}

template<class T1, class T2>
T1 Add(T1 a, T2 b)
{
	return a + b;
}

int main()
{

	cout << Add(1, 2) << endl;
	cout << Add(1.0, 2) << endl;

	return 0;
}

我们进入调试时,第二个Add函数是模板实例化出来的函数。

 

类模板

类模板定义格式:

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

class 类模板名字{}

 我们可以使用类模板写一个动态顺序表,而且通过类模板,我们更加能够体会到他的魅力以及他的强大,如果我们使用C语言来写,而我们的要求是写出多种数据类型的顺序表,用C语言需要重复拷贝多次去修改类型,代码会有很多重复,但是有了模板就不一样了。

template<class T>
class Vector
{

	T* _Data;
	int _size;
	int _capacity;

public:
	Vector(int capacity = 4)
		:_size(0)
		,_capacity(capacity)
		,_Data(new T[_capacity])
	{}
	
	~Vector()
	{
		if (_Data)
			delete[] _Data;

		_Data = nullptr;
		_size = _capacity = 0;
	}

	T& operator[](int pos)
	{
		if (pos >= 0)
		{
			assert(pos < _size && pos >= 0);
			return _Data[pos];
		}
	}
};

各种类型的对象我们都可以实例化出来。

类模板的实例化

类模板实例化与函数模板实例化不同,需要显式写出模板参数

也许你有这样的疑问,是不是因为我没有传参数,所以类模板无法推导T是什么,但是我们可以看看class 类名,有参数列表吗?显然没有,所以才需要我们显式去传模板参数。 

同时我们需要注意的是:

类模板并不是真正的类,就像模板函数一样,只有将他实例化后才是函数,才是真正的类。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JUC】二、线程间的通信(虚假唤醒)

文章目录 0、多线程编程的步骤1、wait和notify2、synchronized下实现线程的通信&#xff08;唤醒&#xff09;3、虚假唤醒4、Lock下实现线程的通信&#xff08;唤醒&#xff09;5、线程间的定制化通信 0、多线程编程的步骤 步骤一&#xff1a;创建&#xff08;将来被共享的&am…

c primer plus_chapter_four——字符串和格式化输入/输出

1、strlen&#xff08;&#xff09;&#xff1b;const&#xff1b;字符串&#xff1b;用c预处理指令#define和ANSIC的const修饰符创建符号常量&#xff1b; 2、c语言没有专门储存字符串的变量类型&#xff0c;字符串被储存在char类型的数组中&#xff1b;\0标记字符串的结束&a…

低价寄快递寄件微信小程序 实际商用版 寄快递 低价寄快递小程序(源代码+截图)前后台源码

盈利模式 快递代下CPS就是用户通过线上的渠道&#xff08;快递小程序&#xff09;&#xff0c;线上下单寄快递来赚取差价&#xff0c;例如你的成本价是5元&#xff0c;你在后台比例设置里面设置 首重利润是1元&#xff0c;续重0.5元&#xff0c;用户下1kg的单页面显示的就是6元…

LiteVNA 能做什么?

最近入手了一台 LiteVNA 设备&#xff0c;性价比非常高。因为之前没有接触过 VNA 这种测试仪器&#xff0c;所以准备好好研究一下。和它类似的一个项目是 NanoVNA6000&#xff0c;价格要高些&#xff0c;但可能性能要好点&#xff0c;另外&#xff0c;文档也要全一些。 VNA …

C++跨DLL内存所有权问题探幽(一)DLL提供的全局单例模式

最近在开发的时候&#xff0c;特别是遇到关于跨DLL申请对象、指针、内存等问题的时候遇到了这么一个问题。 问题 跨DLL能不能调用到DLL中提供的单例&#xff1f; 问题比较简单&#xff0c;就是我现在有一个进程A&#xff0c;有DLL B DLL C&#xff0c;这两个DLL都依赖DLL D的…

Linux系统编程——修改配置文件(应用)

该应用主要调用到strstr函数&#xff0c;我们只需调用该函数并传入相关文件和修改数值即可&#xff0c;下面就是对strstr函数的定义解读以及实现案例 1.调用strstr函数需要包含以下头文件 #include<string.h>2.函数定义格式 char *strstr(char *str1, const char *str…

深度学习4:BatchNormalization(批规范化)

一、起源 训练深度网络的时候经常发生训练困难的问题&#xff0c;因为&#xff0c;每一次参数迭代更新后&#xff0c;上一层网络的输出数据经过这一层网络计算后&#xff0c;数据的分布会发生变化&#xff0c;为下一层网络的学习带来困难。 Batch Normalizatoin 之前的解决方…

c语言:解决数组中数组缺少单个的元素的问题

题目&#xff1a;数组nums包含从0到n的所以整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。O(n)时间内完成。 如&#xff0c;输入&#xff1a;【3&#xff0c;0&#xff0c;1】。 输出&#xff1a; 2 三种方法 &#xff1a; 方法1&#xff1a;排序&#xf…

使用.net 构建 Elsa Workflow

对接过蓝凌OA 也基于泛微OA数据库原型重新研发上线过产品&#xff0c;自研的开源的也上线过 每个公司对OA流程引擎介绍 都不一样的&#xff0c; 比如Elsa 这款微软MVP开源组件&#xff0c;基于跨平台开发的技术含量高&#xff0c;专门做OA的同行推过对应文章。 直接看怎么用吧。…

angular学习笔记

HTML绑定 形式&#xff1a;{{ 变量名 }} {{}}内部可以是 算数运算比较运算逻辑运算三目运算调用函数 {{}}内部不可以是 创建对象&#xff1a;不可以newJSON序列化 属性绑定 形式1&#xff1a;[属性名]“变量名” 形式2&#xff1a;属性名“{{变量名}}” <div [title…

C++ Qt 学习(六):Qt http 编程

1. http 基础 HTTP 基础教程C Web 框架 drogonoatpp 2. C Qt 用户登录、注册功能实现 login_register.h #pragma once#include <QtWidgets/QDialog> #include "ui_login_register.h" #include <QNetworkReply>class login_register : public QDialog…

信息系统项目管理师 教材目录、考试大纲、考情

文章目录 考情考试大纲第1章 信息化发展第2章 信息技术发展第3章 信息系统治理第4章 信息系统管理第5章 信息系统工程第6章 项目管理概论第7章 项目立项管理第8章 项目整合管理第9章 项目范围管理272第10章 项目进度管理297第11章 项目成本管理334第12章 项目质量管理358第13章…

KDE Plasma 6 将不支持较旧的桌面小部件

KDE Plasma 6 进行了一些修改&#xff0c;需要小部件作者进行调整。开发人员&#xff0c;移植时间到了&#xff01; KDE Plasma 6 是备受期待的桌面环境版本升级版本。 最近&#xff0c;其发布时间表公布&#xff0c;第一个 Alpha 版本将于 2023 年 11 月 8 日上线&#xff0…

基于蜻蜓算法优化概率神经网络PNN的分类预测 - 附代码

基于蜻蜓算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于蜻蜓算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于蜻蜓优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

云原生 黑马Kubernetes教程(K8S教程)笔记——第一章 kubernetes介绍——Master集群控制节点、Node工作负载节点、Pod控制单元

参考文章&#xff1a;kubernetes介绍 文章目录 第一章 kubernetes介绍1.1 应用部署方式演变传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上虚拟化部署&#xff1a;可以在一台物理机上运行多个虚拟机&#xff0c;每个虚拟机都是独立的一个环境&…

【操作系统】考研真题攻克与重点知识点剖析 - 第 3 篇:内存管理

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

【论文】利用移动性的比例公平蜂窝调度测量和算法

&#xff08;一支笔一包烟&#xff0c;一节论文看一天 &#xff09;&#xff08;一张纸一瓶酒&#xff0c;一道公式推一宿&#xff09; 摘要1. 引言2. 相关工作3. 模型和问题公式4. 预测FPF调度 &#xff08; P F &#xff09; 2 S &#xff08;PF&#xff09;^2S &#xff08;…

【MySQL系列】 第二章 · SQL(中)

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

PCA(主成分分析)数据降维技术代码详解

引言 随着大数据时代的到来&#xff0c;我们经常会面临处理高维数据的问题。高维数据不仅增加了计算复杂度&#xff0c;还可能引发“维度灾难”。为了解决这一问题&#xff0c;我们需要对数据进行降维处理&#xff0c;即在不损失太多信息的前提下&#xff0c;将数据从高维空间…

pyTorch Hub 系列#2:VGG 和 ResNet

一、说明 在上一篇教程中,我们了解了 Torch Hub 背后的本质及其概念。然后,我们使用 Torch Hub 的复杂性发布了我们的模型,并通过相同的方式访问它。但是,当我们的工作要求我们利用 Torch Hub 上提供的众多全能模型之一时,会发生什么? 在本教程中,我们将学习如何利用称为…