【C++】探索C++模板编程

文章目录

  • 什么是C++模板?
  • 模板的基本语法
  • 类型模板参数
  • 模板函数的示例
  • 类模板的示例
  • 总结

C++模板是一种强大的编程工具,它可以实现泛型编程,使代码更加灵活和可重用。本篇博客将介绍C++模板的基本语法、类型模板参数和模板函数的使用,并通过示例代码演示模板在实际开发中的应用。

什么是C++模板?

C++模板是一种通用的代码蓝图,允许根据不同类型的参数生成特定的函数或类。模板可以在编译时进行类型安全检查,并在运行时生成对应的代码,提高代码的复用性和性能。

模板的基本语法

在C++中,我们可以使用template关键字来定义模板。模板可以包含类型参数和非类型参数,用于接收不同的参数类型和值。下面是一个使用模板的基本语法:

template <typename T>
// 或者
template <class T>// 使用模板定义函数
void print(T value) {// 函数体
}// 使用模板定义类
template <typename T>
class MyTemplateClass {// 类定义
};

类型模板参数

类型模板参数允许我们以泛型的方式接受不同类型的参数。例如,我们可以定义一个模板函数来比较两个数的大小:

template <typename T>
T max(T a, T b) {return (a > b) ? a : b;
}

在上面的代码中,typename T表示我们将接受一个类型为T的参数。模板函数max可以接受不同类型的参数(如int、float、double等),并返回较大的值。

模板函数的示例

下面是一个使用模板函数的示例,计算数组的平均值:

template <typename T, int size>
T average(T arr[]) {T sum = 0;for (int i = 0; i < size; i++) {sum += arr[i];}return sum / size;
}int main() {int intArr[] = {1, 2, 3, 4, 5};double doubleArr[] = {1.5, 2.5, 3.5, 4.5, 5.5};int intAvg = average<int, 5>(intArr);double doubleAvg = average<double, 5>(doubleArr);// 输出结果cout << "Int average: " << intAvg << endl;cout << "Double average: " << doubleAvg << endl;return 0;
}

在这里插入图片描述
在上面的代码中,我们定义了一个模板函数average,它接受一个类型为T的数组和一个非类型参数size,用于指定数组的大小。在main函数中,我们分别传递了一个int类型的数组和一个double类型的数组,并调用了average函数来计算它们的平均值。

类模板的示例

当涉及到类模板时,我们可以将模板应用于整个类定义,以便在不同类型的参数下生成具体的类。以下是一个示例,演示了如何使用类模板创建一个通用的栈(stack)类:

template <typename T>
class Stack {
private:T* data; // 存储数据的数组int size; // 栈的大小int top; // 栈顶位置public:Stack(int s) : size(s), top(-1) {data = new T[size]; // 动态分配内存}~Stack() {delete[] data; // 释放内存}void push(T value) {if (top == size - 1) {cout << "Stack is full." << endl;} else {data[++top] = value;}}T pop() {if (top == -1) {cout << "Stack is empty." << endl;return T(); // 返回默认值} else {return data[top--];}}
};

在上述示例中,我们定义了一个名为Stack的类模板,它接受一个类型参数T。类模板有一个私有数据成员data,用于存储栈中的元素;还有三个私有成员变量size、top,分别表示栈的大小和栈顶的位置。公共成员函数pushpop用于向栈中添加元素和移除元素。

通过使用类模板,我们可以在不同的类型参数下创建具体的栈对象。以下是一个示例,展示了如何使用Stack类模板创建整数栈和浮点数栈:

int main() {Stack<int> intStack(5); // 创建一个整数栈,大小为5Stack<float> floatStack(3); // 创建一个浮点数栈,大小为3intStack.push(1);intStack.push(2);intStack.push(3);floatStack.push(1.5);floatStack.push(2.5);cout << "Popped value from intStack: " << intStack.pop() << endl;cout << "Popped value from floatStack: " << floatStack.pop() << endl;return 0;
}

在上述示例中,我们创建了一个int类型的栈和一个float类型的栈。然后,我们分别向两个栈中压入一些元素,并从栈顶弹出一个元素。通过类模板,我们可以方便地创建不同类型的栈,并在编译时进行类型安全检查。

总结

C++模板是一种强大的编程工具,可以实现泛型编程,提高代码的灵活性和复用性。通过使用模板,我们可以根据不同类型的参数生成特定的函数或类。本文介绍了C++模板的基本语法、类型模板参数和模板函数的示例,并展示了模板在实际开发中的应用。合理利用C++模板可以简化代码编写并提高程序的性能和可维护性。

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

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

相关文章

Spring不再支持Java8了

在今天新建模块的时候发现了没有java8的选项了&#xff0c;结果一查发现在11月24日&#xff0c;Spring不再支持8了&#xff0c;这可怎么办呢&#xff1f;我们可以设置来源为阿里云https://start.aliyun.com/ 。 java8没了 设置URL为阿里云的地址

端口被占用解决方法

1、查出被哪个进程占用&#xff1a; &#xff08;1&#xff09;开始---->运行---->cmd&#xff0c;或者是windowR组合键&#xff0c;调出命令窗口&#xff1b; &#xff08;2&#xff09;输入命令&#xff1a;netstat -ano&#xff0c;列出所有端口的级泥夏情况。在列表…

Phpstudy v8.0/8.1添加 php-7.4.9

1、官网下载最新的php版本 打开Windows版的官网下载&#xff0c;地址&#xff1a;PHP For Windows: Binaries and sources Releases 页面上有不同的PHP版本&#xff0c;这里我们下载的是64位nts版的PHP7.4.9&#xff0c;php-7.4.9-nts-Win32-vc15-x64.zip。 2、解压下载的文…

【开发实践】网页预览excel表格原版样式

一、需求分析 由于业务部门需要&#xff0c;在导出excel表格页面&#xff0c;不需要先下载&#xff0c;就可以直接在页面上预览该表格文件。 二、代码实现 使用Luckysheet实现&#xff1a; 什么是Luckysheet Luckysheet &#xff0c;一款纯前端类似excel的在线表格&#xff0…

这些汽车托运套路你肯定不知道

这些汽车托运套路你肯定不知道 这些套路你肯定不知道.. 学会这三招 汽车托运不怕吃亏 1 看营业执照 首先确定选择的托运公司是否有保障 要求公司出示营业执照和道路运输经营许可证 如果都没有 那就很有可能是无牌照的小作坊!! 这种出问题就肯定没保障 2 保险跟合同 一车一合同 …

vue3父子组件通过$parent与ref通信

父组件 <template><div><h1>ref与$parents父子组件通信 {{ parentMoney }}</h1><button click"handler">点击我子组件的值会减20</button><hr><child ref"children"></child></div> </te…

LeetCode(35)螺旋矩阵【矩阵】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 54. 螺旋矩阵 1.题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a…

Docker配置Halo搭建个人博客-快速入门

Docker配置Halo搭建个人博客-快速入门 1 官方文档2 安装Halo2.1 创建Halo主目录2.2 远程下载配置文件2.3 编辑配置文件2.4 拉取最新镜像2.6 查看容器2.7 开放服务器的防火墙 3 运行3.1 运行项目3.2 停止项目 4 常见问题4.1 没有权限4.2 ommand netstart not found, did you mea…

js moment时间范围拿到中间间隔时间

2023.11.27今天我学习了如何对只返回的开始时间和结束时间做处理&#xff0c;比如后端返回了&#xff1a; [time:{start:202301,end:202311}] 我们需要把中间的间隔渲染出来。 [202301,202302,202303,202304,202305,202306,202307,202308,202309,202310,202311] 利用moment…

DDD全网最通俗易懂讲解(二)

领域事件相关案例 我来给你介绍一个保险承保业务过程中有关领域事件的案例。 一个保单的生成&#xff0c;经历了很多子域、业务状态变更和跨微服务业务数据的传递。这个过程会产生很多的领域事件&#xff0c;这些领域事件促成了保险业务数据、对象在不同的微服务和子域之间的…

ViLT 论文精读【论文精读】

ViLT 论文精读【论文精读】_哔哩哔哩_bilibili 目录 ViLT 论文精读【论文精读】_哔哩哔哩_bilibili 1 地位 2 ViLT做了什么能让它成为这种里程碑式的工作&#xff1f; 3 ViLT到底把模型简化到了什么程度&#xff1f;到底能加速到什么程度&#xff1f; 2.1 过去的方法是怎…

MATLAB实战 | 不同形式的三维曲面图

通常&#xff0c;MATLAB中绘制三维曲面图&#xff0c;先要生成网格数据&#xff0c;再调用mesh函数和surf函数绘制三维曲面。若曲面用含两个自变量的参数方程定义&#xff0c;则还可以调用fmesh函数和fsurf函数绘图。若曲面用隐函数定义&#xff0c;则可以调用fimplicit3函数绘…