【C++语言】模板

当谈到C++中的模板时,我们在谈论一种强大的工具,它允许程序员编写通用的代码,而不必为特定类型编写多个版本。模板使得编写可重用和灵活的代码变得更加容易,因为它们允许您编写与任何数据类型一起使用的通用算法和数据结构。

什么是模板?

模板是一种机制,它允许程序员编写通用的函数或类,而不必指定将要操作的确切数据类型。这使得编写可重用的代码变得更容易。C++中有两种主要类型的模板:

  1. 函数模板: 它允许您编写一个通用函数,可以处理多种不同类型的参数。
  2. 类模板: 它允许您编写一个通用类,可以在不同类型的数据上操作。

函数模板

让我们首先看一个简单的函数模板示例,该模板可以交换任意类型的两个值:

#include <iostream>// 定义一个函数模板
template <typename T>
void swapValues(T &a, T &b) {T temp = a;a = b;b = temp;
}int main() {int x = 5, y = 10;std::cout << "Before swapping: x = " << x << ", y = " << y << std::endl;swapValues(x, y);std::cout << "After swapping: x = " << x << ", y = " << y << std::endl;double a = 3.5, b = 7.8;std::cout << "Before swapping: a = " << a << ", b = " << b << std::endl;swapValues(a, b);std::cout << "After swapping: a = " << a << ", b = " << b << std::endl;return 0;
}

在这个例子中,swapValues 是一个模板函数,它使用了模板声明 template <typename T>。这个模板函数可以交换任何类型的两个值。

类模板

现在,让我们看一个类模板的示例,我们将实现一个简单的通用栈数据结构:

#include <iostream>// 定义一个类模板
template <typename T>
class Stack {
private:T *stackArray;int top;int capacity;public:Stack(int size) : capacity(size), top(-1) {stackArray = new T[size];}~Stack() {delete[] stackArray;}void push(const T &item) {if (top == capacity - 1) {std::cerr << "Stack overflow!" << std::endl;return;}stackArray[++top] = item;}T pop() {if (top == -1) {std::cerr << "Stack underflow!" << std::endl;return T();}return stackArray[top--];}bool isEmpty() const {return top == -1;}
};int main() {Stack<int> intStack(5);intStack.push(10);intStack.push(20);intStack.push(30);while (!intStack.isEmpty()) {std::cout << intStack.pop() << " ";}std::cout << std::endl;Stack<double> doubleStack(5);doubleStack.push(3.5);doubleStack.push(7.8);while (!doubleStack.isEmpty()) {std::cout << doubleStack.pop() << " ";}std::cout << std::endl;return 0;
}

在这个例子中,Stack 是一个类模板,它接受一个类型参数 T。这允许我们实现一个通用的栈数据结构,可以存储任何类型的元素。

模板特化

除了通用模板之外,C++还支持模板特化,它允许您为特定的类型提供自定义实现。例如,对于某些类型,可能需要不同的行为。下面是一个简单的示例:

#include <iostream>// 通用模板
template <typename T>
void printValue(const T &value) {std::cout << "Generic function: " << value << std::endl;
}// 模板特化
template <>
void printValue(const char &value) {std::cout << "Specialized function for char: " << value << std::endl;
}int main() {printValue(5);      // 调用通用函数printValue(3.14);   // 调用通用函数printValue('A');    // 调用特化函数return 0;
}

在这个例子中,printValue 函数有一个通用版本和一个特化版本,当传递一个 char 类型的参数时,特化版本会被调用。

总结

模板是C++中非常强大和灵活的特性,它们允许您编写通用的代码,适用于多种数据类型。通过函数模板和类模板,以及模板特化,您可以实现高度灵活和可重用的代码,这对于构建复杂的软件系统至关重要。然而,需要注意的是,模板有时会导致代码生成的大小增加,因此在使用时需要权衡利弊。

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

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

相关文章

C++入门指南(上)

目录 ​编辑 一、祖师爷画像 二、什么是C 三、C发展史 四、C在工作领域的应用 1. 操作系统以及大型系统软件开发 2. 服务器端开发 3. 游戏开发 4. 嵌入式和物联网领域 5. 数字图像处理 6. 人工智能 7. 分布式应用 五、如何快速上手C 一、祖师爷画像 本贾尼斯特劳斯…

第二届“盘古石杯”全国电子数据取证大赛wp

服务器取证 先对网站进行重构 [rootstudy ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 643626ab3d8b mattermost/mattermost-pre…

Linux部署

先把需要的东西准备好&#xff1a; 第一步解压tomcat&#xff1a; tar -zxvf apache-tomcat-8.5.20.tar.gz 第二步解压jdk: tar -zxvf jdk-8u151-linux-x64.tar.gz 第三步配置Java环境变量&#xff1a; vim /etc/profile 把下面代码放进去&#xff1a; export JAVA_HOME/root…

dell服务器安装ubuntu18.04桌面版教程

目录 一、制作U盘启动盘 1.镜像下载地址&#xff1a; 2.制作U盘启动盘 二、服务器进入bios一系列设置 1.插入U盘启动盘 2.开机过程按F11键&#xff0c;进入Boot Manager &#xff0c;点击 3.点击点击One-shot BIOS Boot Menu 4.进入boot menu ,找到U盘&#xff08;一般…

react18【系列实用教程】useContext —— Context 机制实现越层组件传值 (2024最新版)

什么是 Context 机制&#xff1f; Context 机制是 react 实现外层组件向内层组件传值的一种方案&#xff0c;父组件可以向其内部的任一组件传值&#xff0c;无论是子组件还是孙组件或更深层次的组件。 实现步骤 1.使用createContext方法创建一个上下文对象 Ctx 2.在顶层组件中通…

基于springboot的校园闲置物品交易系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的校园闲置物品交易系统,…

云南区块链商户平台:抓包技术自制开票工具(三)

前言 上节我们将登录的流程梳理完毕了&#xff0c;来到了本章重点&#xff0c;既然开发票就肯定要有以下参数&#xff1a; 原工具不支持识别历史记录&#xff0c;对于我们的小商店来说&#xff0c;开票的公司基本就是固定的几个&#xff0c;如果提供下拉支持选择将会大大降低…

Java高并发场景(银行转账问题)

最近面试问到了银行转账的高并发问题&#xff0c;回答的不是很理想&#xff0c;小编整理了下&#xff0c;题目大概如下&#xff1a; 有一张银行账号表&#xff08;银行账号字段、金额字段&#xff09;&#xff0c;A账号要给B账号转账&#xff0c;A扣款&#xff0c;B收款&#x…

牛客_非技术快速入门_题目总结

牛客_非技术快速入门_题目总结 SQL29 计算用户的平均次日留存率 描述 题目&#xff1a;现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。 示例&#xff1a;question_practice_detail id device_id quest_id result date 1 2138 111 wron…

@Transaction注解详情解释

概念&#xff1a; Transactional注解是Spring框架提供的一个用于声明式事务管理的注解&#xff0c;方便我们管理事务&#xff0c;保证数据的一致性与可靠性。 事务4个基本特性&#xff1a; 原子性&#xff1a;一个事务要不全部&#xff08;sql&#xff09;执行&#xff1b;要不…

Python图形界面(GUI)Tkinter笔记(四):控件的定位(2)

Tkinter(GUI)设计图形界面时有三种控件的包装方法去定位各控件在窗口(父容器、根窗口)上的位置。 【1】pack()方法:用方位来定位位置,类似于Word文档中的文字对齐方式。 【2】grid()方法:用二维表格式的坐标值定位,类似于EXCEL单元格坐标。 【3】place()方法:用窗口…

华为ce12800文件保存python之sftp

##CE12800 交换机上配置 [*SSH Server] dsa local-key-pair create [*SSH Server] sftp server enable [*SSH Server] ssh user adminadmin authentication-type password [*SSH Server] ssh user adminadmin service-type sftp [*SSH Server] ssh user adminadmin sftp-direc…

【机器学习】 技术栈和开发环境搭建

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 博客目录 技术栈编程语言库框架编辑器项目IDE …

linux下的进程通信

进程通信 进程为什么需要通信呢&#xff1f;进程通信的技术背景进程通信本质 进程通信分类管道匿名管道pipe匿名管道原理管道特点 命名管道创建命名管道命名管道原理 System V IPC管道与 System V的区别共享内存函数ftok()shmget() shmat()shmdt()shmctl()删除共享内存System V…

探索数据结构(让数据结构不再成为幻想)

目录 什么是数据结构 数据与结构 什么是算法 复杂度分析 时间复杂度与空间复杂度 时间复杂度 思考&#xff1a; 空间复杂度 常数阶O(1) 对数阶O(logn) 线性阶O(n) 以下为空间复杂度为O(n) 线性对数阶O(nlogn) 平方阶O(n) 指数阶O(2^n) 什么是数据结构 数据结构…

WHAT - CSS Animationtion 动画系列(二)

目录 一、循环波浪二、关键帧呼应三、关键帧顺接四、利用 transform-origin 做拉伸五、大元素可拆分多个小元素联动六、预留视觉缓冲七、随机感&#xff1a;动画周期设置八、抛物线&#xff1a;两个内外div实现x和y向量运动 今天我们主要学习动画实现要素。 一、循环波浪 利用…

类加载机制(双亲委派机制)

文章目录 JVM的作用是什么双亲委派机制加载流程 JVM的作用是什么 我们运行Java程序时&#xff0c;要安装JDK&#xff0c;JDK包含JVM&#xff0c;不同环境的JDK都是不同的。 Java 代码在编译后会形成 class 的字节码文件&#xff0c;该字节码文件通过 JVM 解释器&#xff0c;生…

音视频-H264编码封装- MP4格式转Annex B格式

目录 1&#xff1a;H264语法结构回顾 2&#xff1a;H264编码补充介绍 3&#xff1a;MP4模式转Annex B模式输出到文件示例 1&#xff1a;H264语法结构回顾 在之前文章里介绍过H264的语法结构。 传送门: 视音频-H264 编码NALU语法结构简介 2&#xff1a;H264编码补充介绍 H…

泽众财务RPA机器人常见五个应用场景

泽众RPA&#xff08;即机器人流程自动化&#xff0c;Robotic Process Automation, RPA&#xff09;解决方案是依托于各类先进信息技术手段的虚拟劳动力 &#xff08;数字劳动力&#xff09;&#xff0c;根据预先设定的程序操作指令对任务进行自动化处理&#xff0c;实现业务流程…

网络安全等级保护的发展历程

1994年国务院147号令第一次提出&#xff0c;计算机信息系统实行安全等级保护&#xff0c;这也预示着等保的起步。 2007年《信息安全等级保护管理办法》的发布之后。是等保在各行业深耕落地的时代。 2.0是等保版本的俗称&#xff0c;不是等级。等保共分为五级&#xff0c;二级…