c++取经之路(其八)——基础模板

ops/2024/9/23 14:56:19/

我认为的模板其实就是个懒人工具,你来弄个模板,编译器自动给你生成对应的函数。

函数模板


定义:函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。

我们来举个加法的例子:
基本写法:

template<typename T>
T add( T& x, T& y)
{return x+y;   
}

格式类似于:
template<typename T1, typename T2,......,typename Tn>
返回值类型 函数名(参数列表){}

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

这就是我们最简单的写法,我们怎么用呢?

template<typename T>
T add(T x, T y)
{return x + y;
}int main()
{cout <<add(1, 2)<<endl;cout << add(1.1, 2.) << endl;return 0;
}

结果:

匹配机制:

 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板

例如:

int Add(int left, int right)
{return left + right;
}// 通用加法函数
template<class T1, class T2>
auto Add(T1 left, T2 right)
{return left + right;
}void Test()
{cout<<Add(1, 2)<<endl; // 与非函数模板类型完全匹配,不需要函数模板实例化cout<<Add(1, 2.1)<<endl; // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add                                 
}int main()
{Test();return 0;
}

运行结果:

模板

基本定义:

template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};

注意:我们类模板不建议定义和声明到两个.h和.cpp文件里面,如果想分离一般都在.h文件进行,一般这样写:

template<typename T>
class Sql
{
public:Sql(int x=4);
private:T* _data;int size;int capacity;
};template<typename T >
Sql<T>::Sql(int x)
{_data = new T[x];_capacity = 0;_size = 0;
}

模板注意:

1.模板运行时不检查数据类型,也不保证类型安全,相当于类型的宏替换。

2.类模板是一个类家族,模板类是通过类模板实例化的具体类。

3.模板是代码复用的重要手段。

4..模板类是一个家族,编译器的处理会分别进行两次编译,其处理过程跟普通类不一样。


http://www.ppmy.cn/ops/14420.html

相关文章

Prompt-to-Prompt Image Editing with Cross Attention Control

Prompt-to-Prompt Image Editing with Cross Attention Control TL; DR&#xff1a;prompt2prompt 提出通过替换 UNet 中的交叉注意力图&#xff0c;在图像编辑过程中根据新的 prompt 语义生图的同时&#xff0c;保持图像整体布局结构不变。从而实现了基于纯文本&#xff08;不…

HTTP如何自动跳转到HTTPS,免费SSL证书如何获取

如今HTTPS已经成为了网站标配&#xff0c;然而&#xff0c;对于一些刚刚起步的网站或是个人博客而言&#xff0c;如何自动跳转到HTTPS&#xff0c;以及免费SSL证书的获取&#xff0c;可能还是一个需要解决的问题。下面就来详细解答这两个问题。 我们需要先了解HTTP与HTTPS的区…

IO多路复用函数原型总结(方便查询)

一&#xff0c;select多路复用 1&#xff0c;select&#xff08;5&#xff09;函数原型 ​ 用来进行select多路复用。效率较低。返回值为正数&#xff0c;就是已经就绪的文件描述符的个数&#xff0c;出错返回负数&#xff0c;超时返回0。在Linux内核有个参数__FD_SETSIZE定义…

spring boot3单模块项目工程搭建-下(个人开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 上文衔接 常用依赖介绍以及整合 web组件 测试组件 样板代码生成 数据库连接器 常用工具包 面向切面编…

Vue_管道符“|”(单竖线)的用处

目录 1、管道符是什么 2、应用场景 背景&#xff1a;项目中偶遇在 {{ }} 插值表达式里用了 “&#xff5c;”此写法&#xff0c;一开始误以为是写错了&#xff0c;应该是写成 “&#xff5c;&#xff5c;” 双竖线&#xff08; 逻辑或运算符 &#xff09;&#xff0c;结果询问…

Java基础之JVM对象内存分配机制简介

一 对象内存分配 1.1 运行时数据区域 1.2 常见java应用启动JVM参数&#xff1a; -Xss&#xff1a;每个线程的栈大小(单位kb)-Xms&#xff1a;堆的初始大小&#xff0c;默认物理内存的1/64,示例&#xff1a;-Xms:4g -Xms:10m-Xmx&#xff1a;堆的最大可用大小&#xff0c;默认物…

Linux系统硬盘读写慢,如何排查

若服务器硬盘读写慢&#xff0c;导致处理性能降低&#xff0c;用户响应慢&#xff08;例如&#xff1a;ssh登录操作文件&#xff0c;处理很慢说明磁盘很慢&#xff09; 1.查看硬盘是否繁忙 top 若值比较大&#xff0c;说明当前硬盘比较繁忙&#xff0c;有大量读写操作&#x…

常用的机器学习模型算法

LogisticRegression&#xff08;逻辑回归&#xff09;&#xff1a; 是一种线性模型&#xff0c;用于解决二分类问题。它通过将特征的线性组合映射到一个sigmoid函数上&#xff0c;输出一个0到1之间的概率值&#xff0c;用于预测样本属于某个类别的概率。 DecisionTreeClassifi…