引言

在 C++ 世界里,模板(Template)就像一把万能钥匙。它允许你编写通用的代码,让编译器在需要的时候为具体类型生成对应的函数或类。换句话说,模板是 C++ 泛型编程(Generic Programming) 的基石。

  • 如果说面向对象编程解决的是**“对象的多态**”,那么模板解决的就是“代码的多态”。
  • 本篇文章我们将通过函数模板类模板来学习模板的基础知识。

一、概念

模板即字面意思,可以理解为制作雪糕的这个模板,在模板中填充不同口味的原料(类型),就会得到多个不同口味,相同形状(即具体类型的代码)的雪糕

二、函数模板

定义格式:

template<typename T1, typename T2,…,typename Tn>
返回值类型 函数名(参数列表){}

template<……>要写在定义函数的前面一行

  1. 实现一个加法函数int add(int a,int b),这个函数只能处理int类型的参数
  2. 如果要对doublefloat进行加法运算,
  3. 需要再实现一个相同结构不同类型double add(double a,double b)的函数

这样的代码太过冗余,写一个加法函数的模板就可以解决;传入不同类型,运算不同类型对象;

在这里插入图片描述

1. 隐式实例化

和调用普通函数一样,调用模板函数,模板函数根据传入的参数类型推导模板类型
(⚠️注意:当模板参数只有一个只能传入同一种类型的参数,否则报错)

代码示例:

// 函数模板
template <class T>
T add(const T& a, const T& b)
{return a + b;
}
int main()
{//隐式实例化int a = 1, b = 2;cout << add(a, b) << endl;double c = 10.0, d = 20.0;cout << add(c, d) << endl;return 0;
}

2.显示实例化

  • 调用模板函数时,在函数名后面加上<类型>,例如:add<int> (a,b);
  • <>内的参数个数根据template <>内的参数而定

代码示例:

// 函数模板
template <class T>
T add(const T& a, const T& b)
{return a + b;
}int main()
{//显示实例化int a = 1, b = 2;cout << add<int>(a, b) << endl;double c = 10.0, d = 20.0;cout << add<double>(c, d) << endl;//类型不匹配时,编译器自动进行类型转换,转换失败就报错cout<<add<int>(a,c)<<endl;return 0;
}

3. 普通函数和模板函数的优先级

  1. 一个普通函数与模板函数实例化后的函数类型完全相同时编译器优先调用普通函数
  2. 如果显示实例化(add <int> (a,b)),则会调用模板函数
using namespace std;
// 函数模板
template <class T>
T add(const T& a, const T& b)
{return a + b;
}
int add(int a,int b)
{return a + b;
}
int main()
{int a = 1, b = 2;//情况一:调用int add(int a,int b)普通函数cout << add(a, b) << endl;//情况二:调用T add(const T& a, const T& b)模板函数cout << add<int>(a, b) << endl;double c = 10.0, d = 20.0;//情况三:调用T add(const T& a, const T& b)模板函数cout << add(c, d) << endl;return 0;
}

三、类模板

定义格式

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

实例化

  • 使用类模板进行实例化时,采用类名+<类型>的形式,且后面必须加上<>
  • 实例化的对象类型由类名+<类型>组成,例如:A<int> a1;中的A<int>是对象a1的类型,A只是类名

代码示例:

// 类模板
template <class T>
class A
{
public:T add(const T& a, const T& b){return a + b;}
private:T a;T b;};int main()
{A<int> a1;A<double> a2;cout<<a1.add(1, 1)<<endl;cout<<a2.add(1.0, 1.0)<<endl;return 0;
}

四、总结

函数模板解决的是“写一次函数,适配多种类型”,而类模板则把这种灵活性带进了类的世界。二者加起来,就构成了 C++ 泛型编程的基本骨架。学会它们之后,你就能体会到——代码不再是写死的,而是可以像拼积木一样复用与扩展


写到这里,模板的基础操作就讲完了;如果本文对你有帮助,麻烦你 👍点赞 ⭐收藏 ❤️关注 吧~

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

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

相关文章

项目管理框架如何影响团队协作

在项目执行过程中&#xff0c;项目管理框架不仅是一套工具和流程&#xff0c;更是团队协作方式的基础。不同的项目管理框架会深刻影响团队沟通效率、任务分配、决策方式和整体协同效果。 传统框架通常强调层级与计划&#xff0c;带来高度规范化的协作&#xff1b;敏捷框架则强调…

正向代理,反向代理,负载均衡还有nginx

这是一个非常核心且重要的后端/运维知识领域。我会用尽可能清晰易懂的方式&#xff0c;结合生动的比喻&#xff0c;为你详细梳理这些概念。核心概念一览我们先从一个宏观的角度来理解它们之间的关系&#xff1a;代理&#xff08;Proxy&#xff09;&#xff1a; 一个中间人的角色…

WebSocket压缩传输优化:机器视觉高清流在DCS中的低延迟方案

引言在现代工业自动化领域&#xff0c;分布式控制系统&#xff08;DCS&#xff09;正面临着前所未有的数据挑战。随着机器视觉技术的广泛应用&#xff0c;高清视频流已成为监控产品质量、检测设备异常和保障生产安全的重要手段。然而&#xff0c;将720P、1080P甚至4K分辨率的高…

《Linux常见命令》

ls 功能&#xff1a;列出目录下的子目录与文件&#xff0c;对于文件&#xff0c;还会列出文件名及其他信息。 语法&#xff1a;ls [选项] [目录或文件] 1.常用选项及说明选项说明-a列出目录下的所有文件&#xff0c;包括以 . 开头的隐含文件-d将目录象文件一样显示&#xff0c;…

Python数据分析:函数定义时的位置参数。

目录1 代码示例2 欢迎纠错3 免费爬虫4 论文写作/Python 学习智能体1 代码示例 直接上代码。 def pargs1(a, b):"""先看确定数量的位置参数。最简单的位置参数。a和b都叫而且只能叫“位置参数”。所谓确定数量&#xff0c;很明显&#xff0c;是两个就是两个&…

《没有架构图?用 netstat、ss、tcpdump 还原服务连接与数据流向》

&#x1f4e2; 你是否遇到过这些问题&#xff1f; 接手一个老项目&#xff0c;只有服务器账号&#xff0c;没有架构图&#xff1f;服务突然异常&#xff0c;但不知道它依赖哪些外部系统&#xff1f;想画数据流向图&#xff0c;却找不到文档&#xff1f; 别担心&#xff01;只要…

Redis列表(List):实现队列/栈的利器,底层原理与实战

Redis列表&#xff08;List&#xff09;&#xff1a;实现队列/栈的利器&#xff0c;底层原理与实战 1. Redis列表概述 1.1 什么是Redis列表 Redis列表&#xff08;List&#xff09;是一个有序的字符串元素集合&#xff0c;支持在头部和尾部进行高效的插入和删除操作。它可以…

OpenCV 图像双三次插值

文章目录 一、简介 二、实现代码 三、实现效果 参考资料 一、简介 在数学中,双三次插值是三次样条插值(一种将三次插值应用于数据集的方法)的扩展,用于在二维规则网格上插值数据点。插值曲面(指核形状,而非图像)比通过双线性插值或最近邻插值获得的相应曲面更平滑。双三…

【Java实战㊲】Spring Security:为Spring Boot应用筑牢安全防线

目录 一、Spring Security 概述 1.1 Spring Security 核心功能 1.2 Spring Security 与 Shiro 对比 二、Spring Boot 整合 Spring Security 基础 2.1 整合依赖导入 2.2 默认安全配置 2.3 自定义用户认证 2.4 自定义登录与注销 三、Spring Security 授权控制 3.1 基于角色的授权…

linux命令—stat

命令简介 stat是Linux中用于查看文件或文件系统的详细状态信息的强大命令。它比ls -l更全面&#xff0c;其输出信息包括但不限于&#xff1a;文件大小、权限、所有者、最后访问/修改/状态变更时间、inode号、所在设备信息等。 用法 stat命令的语法格式如下 stat [选项] 文件…

解决串口数据乱序问题

环境&#xff1a;jetson nano ubuntu 20.04python 3.12终于是找到解决串口乱序的最佳解决办法了&#xff0c;先来看看什么是串口乱序&#xff1a;这就是一个典型的串口乱序&#xff0c;我的发送端发送 的协议为0x55 0x51 ...0x55 0x52 ...0x55 0x53 ...0x55 0x54 ...在这四条协…

Spring的注解

声明Bean的注解 Component Controller Service Repository 后三种为Component的别名&#xff0c;之所以不同是因为可读性的考虑 Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Component public interface Controller {AliasFor(//别名an…

UVM寄存器模型与通道机制

接续UVM基础入门文章。前言重点讲述UVM常用的接口连接方式。寄存器模型&#xff1a;UVM寄存器模型&#xff08;Register Model&#xff09;是一组高级抽象的类&#xff0c;用于对DUT&#xff08;Design Under Test&#xff09;中具有地址映射的寄存器和存储器进行建模&#xff…

12.NModbus4在C#上的部署与使用 C#例子 WPF例子

一、Modbus TCP/IP是什么Modbus TCP/IP是一种基于TCP/IP协议的工业自动化通信协议。它在Modbus协议的基础上&#xff0c;利用TCP/IP网络进行数据传输&#xff0c;使得工业设备之间的通信更加便捷和高效。常用的Modbus功能码包括0x03&#xff08;读保持寄存器&#xff09;、0x06…

硬件开发2-汇编1(ARMv7-A)- 基本概要

一、汇编基本概要1、ARM数据和指令类型2、ARM字节顺序即可大端存储也可小端存储&#xff0c;默认小端存储&#xff08;不建议修改&#xff09;、kernel&#xff08;内核&#xff09;中的&#xff0c;CPSR&#xff08;当前程序状态寄存器&#xff09;可修改大小端存储3、ARM处理…

Linux中进程和线程常用的API详解

进程与线程基础及 Linux 进程间通信&#xff08;IPC&#xff09;详解 一、程序与进程 1. 程序&#xff08;静态文件&#xff09; 程序是存储在磁盘上的可执行文件&#xff0c;是静态实体&#xff0c;不占用 CPU、内存等运行时资源&#xff0c;仅占用磁盘空间。不同操作系统的可…

VS Code 插件开发教程

VS Code 插件开发教程 概述 Visual Studio Code&#xff08;简称 VS Code&#xff09;是一款由 Microsoft 开发的开源轻量级编辑器&#xff0c;支持跨平台&#xff08;Windows、macOS、Linux&#xff09;。 其最大的优势之一是强大的插件系统&#xff0c;开发者可以通过编写扩…

Docker技术解析

1.Docker安装 1.如果Ubuntu自带的Docker版本太低&#xff0c;我们需要卸载旧版本并安装新的 sudo apt-get remove docker docker-engine docker.io containerd runc2. 备份原有软件源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak3.选择合适的镜像源 # 或者使用…

TCP套接字的使用

Java中使⽤TCP协议通信,使用ServerSocket来建立链接,使用Socket进行通信.ServerSocketServerSocket是创建TCP服务端Socket的api,主要方法:方法签名说明ServerSocket(int port)创建一个服务端流套接字Socket,并绑定指定端口Socket accpet()开始监听指定端口,有客户端链接后,返回…

linux执行systemctl enable xxxxx 报 Failed to execute operation: Bad message

linux执行systemctl enable redis.service 报 Failed to execute operation: Bad message 如果在执行 systemctl enable 命令时遇到 "Failed to execute operation: Bad message" 错误&#xff0c;可能是由于以下几个原因导致的。你可以按照以下步骤进行排查和解决&a…