C++的模板template

一、什么是模板

        C++中的模板分为类模板函数模板,并不是一个实际的类或函数,这指的是编译器不会自动为其生成具体的可执行代码。只有在具体执行时编译器才帮助其实例化

二、为什么引入模板

        拿我们最常见的交换函数来举例子,如果我们编写一个交换int类型变量的函数,如下:

bool Swap(int &a, int &b) {int c = a;a = b;b = c;return true;
}

        但如果我们想要编写一个通过函数来交换float的函数,我们又要写另一个函数,如下:

bool Swap(float &a, float &b) {float c = a;a = b;b = c;return true;
}

         那接下来如果需要交换double,char,bool,甚至一些结构体或者类的交换函数,那么我们的工作量就会很大。细心观察会发现,其实上边两个函数唯一不同的便是交换的变量类型不同,如果我们把变量类型设置为一个抽象的X,在具体需要交换的时候,再去根据具体的类型去自动适应,这便是C++的template模板的巧妙之处。

三、使用方式

        C++模板采用template关键字修饰

3.1 函数模板

        具体写法如下:

template <typename 参数类型1, typename 参数类型2,...>
返回值类型 函数名称(形参1, 形参2,...) {函数体
}

        上边代码的typename关键字也可以用class代替。下边给出一个交换函数模板的例子:

template <typename T>
bool Swap(T &a, T &b) {T c = a;a = b;b = c;return true;
}

  3.2 类模板

          具体写法如下:

template <typename 模板名称1, typename 模板名称2,...>
class 类名称{类成员
}

        注意,在实例化类模板对象时,需要在类的结尾加上<具体模板名称>。 比如以下例子:

template <typename T1, typename T2>
class NNUM {private :T1 num1;T1 num2;public :NNUM(T1 num1, T1 num2) {this->num1 = num1;this->num2 = num2; }void print_NNUM(T2 str) {cout << "str : [" << str << "]" << endl;cout << "num1 : <" << this->num1 << ">, " << "num2 : <" << num2 << ">" << endl;}
};

       这里是一个用了2个模板类型(T1和T2)的类模板,那么我们在实例化时候就要按照以下代码,将具体需要使用的T1与T2类型体现出来:

NNUM<int, string> n1 = NNUM<int, string>(123, 456);

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

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

相关文章

代码随想录 二叉树第二周

目录 101.对称二叉树 100.相同的树 572.另一棵树的子树 104.二叉树的最大深度 559.N叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数 110.平衡二叉树 257.二叉树的所有路径 101.对称二叉树 101. 对称二叉树 已解答 简单 相关标签 相关企业 给你一…

《求生之路2》服务器如何选择合适的内存和CPU核心数,以避免丢包和延迟高?

根据求生之路2服务器的实际案例分析选择合适的内存和CPU核心数以避免丢包和延迟高的问题&#xff0c;首先需要考虑游戏的类型和对服务器配置的具体要求。《求生之路2》作为一款多人在线射击游戏&#xff0c;其服务器和网络优化对于玩家体验至关重要。 首先&#xff0c;考虑到游…

Java应用程序注册成Linux系统服务后,关闭Java应用程序打印系统日志

Java应用程序有自己的日志框架&#xff0c;有指定位置的日志文件&#xff0c;不需要在系统日志里记录&#xff0c;占用磁盘空间。 1.Linux系统文件目录 /etc/systemd/system/ 找到要修改的Java应用程序服务配置 比如bis-wz-80.service 2.设置不打印日志 StandardOutputnull S…

centos7 搭建 harbor 私有仓库

一、下载安装 1.1、harbor 可以直接从 github 上下载&#xff1a;Releases goharbor/harbor GitHub 这里选择 v2.10.0 的版本 wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz 1.2、解压 tar zxvf harbor-offlin…

L2 网络 Mint Blockchain 正式对外发布测试网

Mint Blockchain 是由 NFTScan Labs 发起的聚焦在 NFT 生态的 L2 网络&#xff0c;致力于促进 NFT 资产协议标准的创新和 NFT 在现实商业应用场景中的大规模采用。 Mint Blockchain 于 2024 年 2 月 28 号正式对外发布测试网&#xff0c;开始全面进入生态开发者测试开发阶段。 …

2403C++,C++11玩转无栈协程

原文 C11里也能玩无栈协程了? 答案是:可以! 事实上异网在很早时,C11里就可用无栈协程写异步代码了,只不过用起来不太方便,来看看C11里怎么用异网无栈协程写一个回音服务器的吧. #包含 <异网.h> #包含 <内存> #包含 <向量> #包含 <异网/产生.h> 用 …

c++异常机制(5)-- 继承与异常

我们在c异常机制(3)中自定义类型&#xff0c;我们将相应的异常封装成了类&#xff0c;在类中实现一些方法&#xff0c;对异常进行处理。其中每一个类都实现了print()方法。 我们使用throw抛出相应异常的虚拟对象&#xff0c;在catch参数中进行匹配&#xff0c;但是如果有很多异…

Springboot项目集成短信验证码(超简单)

操作流程 注册验证码平台创建验证码模版开始集成&#xff08;无需引入第三方库&#xff09; 注册并登陆中昱维信验证码平台 获取AppID和AppKey。 创建验证码模版 创建验证码模版&#xff0c;获取验证码模版id 开始集成 创建controller import org.springframework.web.bi…

MATLAB环境下基于随机游走拉普拉斯算子的快速谱聚类方法

古人有云&#xff0c;物以类聚&#xff0c;在面临信息爆炸问题的今天&#xff0c;对信息类别划分的价值日益显现&#xff0c;并逐步成为学者们的研究热点。分类和聚类是数据挖掘的重要工具&#xff0c;是实现事物类别划分的左右手&#xff0c;聚类又是分类一种特殊的方式。所谓…

CodeWhisperer安装教导--一步到位!以及本人使用Whisperer的初体验。

CodeWhisperer是亚马逊出品的一款基于机器学习的通用代码生成器&#xff0c;可实时提供代码建议。类似 Cursor 和Github AWS CodeWhisperer 亚马逊科技的CodeWhisperer是Amazon于2021年12月推出的一款代码补全工具&#xff0c;与GitHub Copilot类似。主要的功能有:代码补全注释…

猫毛过敏养猫人士的必备养猫好物-宠物空气净化器品牌分享

许多猫奴在与猫相处一段时间后突然对猫毛过敏&#xff0c;这真是令人难受。一些人认为对猫咪过敏是因为它们在空气中飘浮的毛发引起的&#xff0c;但实际上大部分人之所以过敏是因为对猫身上一种微小的蛋白质过敏。这种导致过敏的蛋白质附着在猫咪的一些皮屑上。我们都知道猫咪…

前端架构: 脚手架通用框架封装之入口文件开发(教程一)

脚手架入口文件开发 创建脚手架项目: abc-cli $ mkdir abc-cli && cd abc-cli 全局安装 lerna, $ npm i -g lerna 基于 lerna 完成项目初始化 $ lerna init 基于 lerna 创建脚手架 cli $ lerna create cli一路回车 好现在生成了一个 cli 的模板&#xff0c;目前需要…

Qt 中Json的构造和解析简单例子

概述: Qt中使用Json比较方便&#xff0c;不像纯C需要导入CJson RapidJson JsonCpp等第三方的库&#xff0c;主要使用到QJsonDocument、QJsonObject对象即可 1、如何构造一个json字符串 假如我们需要构造 {"cmd":"1001","data":{"content&q…

Linux 下安装Jupyter

pip3 install jupyter pip3 install ipython -------------------------------------------- pip3 install jupyterlab jupyter lab pip3 list | grep jupyterlab 启动&#xff1a; python3 -m jupyter lab 2.安装朱皮特 pip3 install -i https://pypi.douban.com/simpl…

高性能的key-value数据库Redis 介绍

Redis 是一个高性能的key-value数据库。 Redis是一个开源的键值存储系统&#xff0c;通常用于缓存和消息传递。它支持多种类型的数据结构&#xff0c;如字符串、列表、集合、散列表和有序集合等。Redis的特点是提供了高性能、灵活性和可伸缩性。 Redis的主要特点包括&#xff…

Pytorch学习 day02(加载数据)

加载数据 * Dataset提供一种方式&#xff1a;来获取数据及其label&#xff0c;给数据进行编号 * Dataloader为神经网络提供不同的数据形式 Dataset的组织形式有很多种&#xff0c;例如&#xff1a; 将label放在文件夹名上&#xff0c;如下&#xff1a; #Dateset # --train #…

Python算法题集_组合总和

Python算法题集_组合总和 题39&#xff1a;组合总和1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【值传递回溯】2) 改进版一【引用传递堆栈回溯】3) 改进版二【过程值列表缓存遍历后检索】 4. 最优算法5. 相关资源 本文为Python算法题集之一的…

.halo勒索病毒的最新威胁:如何恢复您的数据?

尊敬的读者&#xff1a; 随着科技的发展&#xff0c;网络安全已经成为我们日常生活中不可忽视的重要议题。其中&#xff0c;勒索病毒是当前网络安全威胁中的一大挑战&#xff0c;而“.halo”勒索病毒更是近期备受关注的恶意软件之一。本文将介绍关于“.halo”勒索病毒的背景知…

AI新工具(20240227) StickerBaker文本生成贴纸的工具;Mistral Large;Rewind等

StickerBaker - 基于Replicate和Fly.io技术&#xff0c;100%开源的制作贴纸的工具 StickerBaker是一个基于人工智能的贴纸创作工具&#xff0c;允许用户通过输入特定的提示语句生成独特的贴纸。这个工具使用了Replicate平台来生成贴纸&#xff0c;同时依托于Fly.io作为其基础设…

算法项目外包的收费方式

针对算法研究性项目的收费方式和注意事项&#xff0c;这取决于项目的具体性质、规模和所涉及的技术领域。以下是一些常见的收费方式和需要注意的问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 收…