对模版以及模版中参数的理解

所谓模板,实际上是建立一个通用函数或类,其类内部的类型和函数的形参类型不具体指定,用一个虚拟的类型来代表。


就比方说你想要实现 一个Add的加法函数,面对不同的类型,你是否要进行多次函数重载呢,其实这多个函数实现的底层原理都是一样的,只不过是类型不同,所以祖师爷就根据这种情况设计出了模版。


 函数模版

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


格式要求

在定义函数前要写上这一行:template<typename T1, typename T2,......,typename Tn>,这里的typename换成class也是OK的。而函数定义就是正常写,只不过将原来的实例化类型换成虚拟化类型(也就是上一行的T1、T2......)


举例Add函数模版

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

因为这里需要整体替换的就一个类型所以模版形参中给一个T就行。

但是你的类型也必须要进行统一才可以:

int main()
{double sum = Add(1.2, 1);cout << sum << endl;
}

如果主函数这样写的话,那就会报错:  没有与参数列表匹配的 函数模板 "Add"

这样也有有解决方法:函数模版实例化(实际也是匹配)


函数模版实例化 

函数模版的实例化其实也就是将函数参数进行统一成其中一个模版函数的参数。

隐式实例化

即是不直接告诉编译器参数的类型,让编译器在自己生成的模拟板函数中去找与之匹配的。

template<class T>
T Add(const T& a, const T& b)
{return a + b;
}
int main()
{double sum = Add(1.2, (double)1);//强制类型转换cout << sum << endl;
}

其实这就是一种隐式转换。

其实在你写模版函数时发生了两次编译:

  1. 实例化前,先检查模板代码本身,查看语法是否正确。
  2. 实例化期间,检查模板代码,查看是否所有的调用都有效。

在函数模版生成是就相当于编译器自己生成了多个不同类型的重载函数,在你调用函数模版时,编译器就会在生成的所有重载函数中找一个最匹配的让你调用。

显式实例化 

显示实例化的特点就是在函数名后面加 <type>,type就是你调用函数时的具体类型

int main()
{double sum = Add<double>(1.2,1);cout << sum << endl;
}

这就相当于直接告诉编译器调用的函数参数类型是double型,所以这就是显式实例化 。


函数模版和模版函数 

这里和你们讲一下这个基本概念,函数模版与模版函数。

首先,它们俩根本就不是一个东西。

函数模版是个模版,它相当于是一个函数家族,而家族成员就是模版函数(一个实例化的函数)而我们一般会写一个函数模版,然后编译器自动生成不同类型的模版函数,再给使用者使用。

 


类模版

template<typename T, int N>
class Test
{
public:Test():_arr(new T[N]){for (int i = 0; i < N; i++)_arr[i] = i+0.5;}~Test(){delete[]_arr;}private:T* _arr;
};

像这个模版的功能就是单纯的创建一个数组并完成初始化,这里用到了两个模版参数,所以就写成:template<typename T, int N>,int N是数组大小,所以就直接写int类型就行

但是类模版相较于函数模版没有隐式实例化,只能通过显式实例化来创建对象。


类模板中函数放在类外进行定义时,需要加模板参数列表

template<typename T, int N>
class Test
{
public:Test();~Test(){delete[]_arr;}private:T* _arr;
};template<typename T, int N>
Test<T, N>::Test()
:_arr(new T[N])
{for (int i = 0; i < N; i++)_arr[i] = i + 0.5;
}

不仅仅要加上模版参数列表,还要加上类类型,模版类的类型和一般类的类型是不一样的,模版类的类型=类名+<T1,T2...>,而相较于一般的类而言,类名就是类型

模版参数

现在谈一谈模版的参数,提前声明:模版参数可不是函数参数和类参数,这一定要分开。

模版参数的形参就是模板参数列表中的T,用上面的模版类为例就是有两个模版参数T和N而有了形参,实参也就容易了,就是double和5.



欢迎莅临指导!!!

 

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

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

相关文章

HCIP——前期综合实验

前期综合实验 一、实验拓扑二、实验要求三、实验思路四、实验步骤1、配置接口IP地址2、交换机配置划分vlan10以及vlan203、总部分部&#xff0c;骨干网配置OSPF分部总部骨干网 4、配置BGP建立邻居关系总部骨干网分部 5、发布用户网段6、将下一跳改为本地7、允许AS重复8、重发布…

计算机图形学笔记2-Viewing 观测

观测主要解决的问题是如何把物体的三维“模型”变成我们在屏幕所看到的二维“图片”&#xff0c;我们在计算机看到实体模型可以分成这样几步&#xff1a; 相机变换(camera transformation)或眼变换(eye transformation)&#xff1a;想象把相机放在任意一个位置来观测物体&#…

Electron + Vue3 + Vite + TS 构建桌面应用

之前是使用React、Electron、TS和webpack来构建桌面应用的。虽然功能齐全,但是打包等等开发的体验不太理想,总感觉太慢了。作为一个开发者,我们总是希望,执行构建命令后,可以快速打包或者启动本地应用,且通过更少的配置,来完成开发体验。 现在的vite已经得到广泛的应用…

Linux操作系统学习,Linux基础命令大全

目录 第一章、Linux简介和安装1.1&#xff09;Linux简介和分类1.2&#xff09;安装VMware虚拟机&#xff0c;在虚拟机中安装CentOS 7 第二章、虚拟机中Linux的IP地址配置详解2.1&#xff09;什么是IP地址&#xff0c;如何查看2.2&#xff09;虚拟机NAT模式中Linux的IP地址设置有…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

mysql-入门笔记-3

# ----------排序查询-------- # 语法 # select 字段列表 from 表名 order by 字段1 排序方式1 ,字段2 排序方式2 ; DESC 降序 ASC升序 # 1 根据年龄对公司的员工进行升序排序---默认升序-黄色提示代码冗余 select * from userTable order by age ASC ; # 2 根据入职时间,对员…

【二叉树进阶】二叉树的前中后序遍历(非递归迭代实现)

文章目录 1. 二叉树的前序遍历1.1 思路分析1.2 AC代码 2. 二叉树的中序遍历2.1 思路分析2.2 AC代码 3. 二叉树的后序遍历3.1 思路13.2 思路1AC3.3 思路23.4 思路2AC 1. 二叉树的前序遍历 题目链接: link 不用递归&#xff0c;用迭代算法如何实现对二叉树的前序遍历&#xff1f…

牛客网Verilog刷题——VL48

牛客网Verilog刷题——VL48 题目答案 题目 在data_en为高期间&#xff0c;data_in将保持不变&#xff0c;data_en为高至少保持3个B时钟周期。表明&#xff0c;当data_en为高时&#xff0c;可将数据进行同步。本题中data_in端数据变化频率很低&#xff0c;相邻两个数据间的变化&…

大模型开发(十五):从0到1构建一个高度自动化的AI项目开发流程(上)

全文共5600余字&#xff0c;预计阅读时间约13~20分钟 | 满满干货(附全部代码)&#xff0c;建议收藏&#xff01; 本文目标&#xff1a;提出一种利用大语言模型(LLMs)加快项目的开发效率的解决思路&#xff0c;本文作为第一部分&#xff0c;主要集中在如何完整的执行引导Chat模…

网盘共享文件的优势及对团队办公的帮助

伴随着科技的发展&#xff0c;互联网逐步渗透了企业办公方式。各种类型的网盘应运而生&#xff0c;成为当下文件共享的主要方式之一。那么网盘共享文件有什么优势&#xff1f;对团队办公有何帮助呢&#xff1f; 网盘共享文件的优势 1、方便快捷&#xff1a;用户通过移动设备即…

git面试题

文章目录 git经常用哪些指令git出现代码冲突怎么解决你们团队是怎么管理git分支的如何实现Git的免密操作 git经常用哪些指令 产生代码库 新建一个git代码库 git init下载远程项目和它的整个代码历史 git clone 远程仓库地址配置 显示配置 git config --list [--global]编辑配置…

Kubernetes 使用 helm 部署 NFS Provisioner

文章目录 1. 介绍2. 预备条件3. 部署 nfs4. 部署 NFS subdir external provisioner4.1 集群配置 containerd 代理4.2 配置代理堡垒机通过 kubeconfig 部署 部署 MinIO添加仓库修改可配置项 访问nodepotingress 1. 介绍 NFS subdir external provisioner 使用现有且已配置的NFS…

设计模式再探——代理模式

目录 一、背景介绍二、思路&方案三、过程1.代理模式简介2.代理模式的类图3.代理模式代码4.代理模式还可以优化的地方5.代理模式的项目实战&#xff0c;优化后(只加了泛型方式&#xff0c;使用CGLIB的代理) 四、总结五、升华 一、背景介绍 最近在做产品过程中对于日志的统一…

2023年自然语言处理与信息检索国际会议(ECNLPIR 2023) | EI Compendex, Scopus双检索

会议简介 Brief Introduction 2023年自然语言处理与信息检索国际会议(ECNLPIR 2023) 会议时间&#xff1a;2023年9月22日-24日 召开地点&#xff1a;中国杭州 大会官网&#xff1a;ECNLPIR 2023-2023 Eurasian Conference on Natural Language Processing and Information Retr…

【机器学习】Cost Function for Logistic Regression

Cost Function for Logistic Regression 1. 平方差能否用于逻辑回归&#xff1f;2. 逻辑损失函数loss3. 损失函数cost附录 导入所需的库 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from plt_logistic_loss import plt_logistic_cost, plt_two_…

自己实现MyBatis 底层机制--抽丝剥茧(上)

&#x1f600;前言 本篇博文是学习过程中的笔记和对于MyBatis底层机制的分析思路&#xff0c;希望能够给您带来帮助&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到…

誉天程序员-瀑布模型-敏捷开发模型-DevOps模型比较

文章目录 2. 项目开发-开发方式2.1. 瀑布开发模型2.2. 敏捷开发模型2.3. DevOps开发模型2.4. 区别 自增主键策略1、数据库支持主键自增自增和uuid方案优缺点 2. 项目开发-开发方式 由传统的瀑布开发模型、敏捷开发模型&#xff0c;一跃升级到DevOps开发运维一体化开发模型。 …

IPv6 over IPv4隧道配置举例

配置IPv6 over IPv4手动隧道示例 组网需求 如图1所示&#xff0c;两台IPv6主机分别通过SwitchA和SwitchC与IPv4骨干网络连接&#xff0c;客户希望两台IPv6主机能通过IPv4骨干网互通。 图1 配置IPv6 over IPv4手动隧道组网图 配置思路 配置IPv6 over IPv4手动隧道的思路如下&…

【雕爷学编程】MicroPython动手做(10)——零基础学MaixPy之神经网络KPU2

KPU的基础架构 让我们回顾下经典神经网络的基础运算操作&#xff1a; 卷积&#xff08;Convolution&#xff09;:1x1卷积&#xff0c;3x3卷积&#xff0c;5x5及更高的卷积 批归一化&#xff08;Batch Normalization&#xff09; 激活&#xff08;Activate&#xff09; 池化&…

单例模式(Singleton)

单例模式保证一个类仅有一个实例&#xff0c;并提供一个全局访问点来访问它&#xff0c;这个类称为单例类。可见&#xff0c;在实现单例模式时&#xff0c;除了保证一个类只能创建一个实例外&#xff0c;还需提供一个全局访问点。 Singleton is a creational design pattern t…