当前位置: 首页 > news >正文

【C++】什么是函数模板/类模板?

文章目录

  • 一、函数模板
    • 1.什么是函数模板?
    • 2.函数模板格式
    • 3.函数模板原理
    • 4.函数模板实例化
      • (1)隐式实例化
      • (2)显示实例化
  • 二.类模板
    • 1.类模板定义格式
    • 2.类模板的实例化
  • 总结


一、函数模板

在这里插入图片描述

1.什么是函数模板?

函数模板简单来说就是一个模板,与函数参数的类型无关,是一个模子,不是真正的函数,实例化的函数会根据实参的类型自动推导类型。

2.函数模板格式

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

3.函数模板原理

函数模板是一个模板,并不是真正的函数,它是根据传递过来的实参的类型实例化一个具体的函数,相当于我们将重复的事情交给了编译器来操作。

比如说:

template<typename T>T Add(const T& a1, const T& a2)
{return a1 + a2;
}int main()
{int a = 10, b = 20;double c = 3.14,d = 2.11;cout << Add(a, b) << endl;cout << Add(c, d) << endl;	return 0;
}

我们定义了一个加法函数的函数模板,来进行加法操作,函数模板会根据我们传递的实参的类型自动实例化出不同的Add函数,这些函数之间构成函数重载。

4.函数模板实例化

(1)隐式实例化

举一个简单的例子:
在我们定义的函数模板中,只给定一个模板参数类型,但是我们可能会有两个不同的实参类型。

template<typename T>T Add(const T& a1, const T& a2)
{return a1 + a2;
}int main()
{int a = 10;double b = 20.3;cout << Add(a, b) << endl;return 0;
}

对于只有一个类型的函数模板,却同时出现了两种不同类型的实参,编译器就无法确认到底用哪个实参类型实例化了。

解决办法:

int main()
{int a = 10;double b = 20.3;cout << Add((double)a, b) << endl;cout << Add(a, (int)b) << endl;//可能存在精度丢失的情况return 0;
}

隐式类型转换,就可以解决编译器无法识别的情况。

(2)显示实例化

template<typename T>T Add(const T& a1, const T& a2)
{return a1 + a2;
}int main()
{int a = 10;double b = 20.3;cout << Add(a, b) << endl;return 0;
}

对于这个案例,还有一种解决方案:

int main()
{int a = 10;double b = 20.3;cout << Add<int>(a, b) << endl;return 0;
}

这样的方法叫做显式实例化,实际生活中,我们很少会遇到需要显式实例化的情况,不过对于下面的情况,就必须要显式实力化。

template<class T>
T* Alloc(int n)
{return new T[n];
}int main()
{Alloc<double>(10);return 0;
}

在这样的情况下,我们没有使用函数模板类型,所以仅仅传递实参n无法推导T的类型,这种情况下必须要使用显式实例化。

二.类模板

1.类模板定义格式

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

2.类模板的实例化

注意:

普通类的类型和类名相同
模板类的类型和类名不同

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可。

类模板名字不是真正的类,而实例化的结果才是真正的类。

比如:

// string类名,string<int>才是类型
string<int> s1;
string<double> s2;

1.不管是类模板还是函数模板,其作用范围就是紧跟着的类/函数。

也就是看{}

2.类模板中函数放在类外进行定义时,需要加模板参数列表
比如:

template<typename T>
class Stack
{
public:Stack(size_t capacity = 3);void Push(const T& data);   // 其他方法...~Stack(){if (_array){delete[]_array;_capacity = _size = 0;}}private:T* _array;int _capacity;int _size;
};//缺省参数不能给在函数定义,只能在声明给缺省值
//模板的作用域就是专门给一个函数或者一个类用的
//可以看{}的作用范围是那里,模板的作用范围就是哪里。
template<typename T>
Stack<T>::Stack(size_t capacity)
{_array = new T[capacity];_capacity = capacity;_size = 0;
}template<typename T>
void Stack<T>::Push(const T& data)
{// CheckCapacity();_array[_size] = data;_size++;
}

函数在类外面进行定义时,需要加类模板的参数列表。

注意:不建议模板实例化出来的函数的声明和定义分离。
注意:不建议模板实例化出来的函数的声明和定义分离。
注意:不建议模板实例化出来的函数的声明和定义分离。

上面的例子仅仅是为了演示。


总结

本文讲述了函数模板和类模板的相关问题。

相关文章:

【C++】什么是函数模板/类模板?

文章目录 一、函数模板1.什么是函数模板&#xff1f;2.函数模板格式3.函数模板原理4.函数模板实例化&#xff08;1&#xff09;隐式实例化&#xff08;2&#xff09;显示实例化 二.类模板1.类模板定义格式2.类模板的实例化 总结 一、函数模板 1.什么是函数模板&#xff1f; 函…...

为什么是ChatGPT引发了AI浪潮?

目录 BERT和GPT简介 BERT和GPT核心差异 GPT的优势 GPT的劣势 总结 随着近期ChatGPT的火热&#xff0c;引发各行各业都开始讨论AI&#xff0c;以及AI可以如何应用到各个细分场景。为了不被时代“抛弃”&#xff0c;我也投入了相当的精力用于研究和探索。但在试验的过程中&…...

批处理文件(.bat)启动redis及任何软件(同理)

批处理文件 每次从文件根目录用配置文件格式来启动redis太麻烦了 可以在桌面上使用批处理文件&#xff08;.bat&#xff09;启动Redis&#xff0c;请按照以下步骤进行操作&#xff1a; 打开文本编辑器&#xff0c;如记事本。 在编辑器中输入以下内容&#xff1a; 将文件保存…...

深度学习求解稀疏最优控制问题的并行化算法

稀疏最优控制问题 问题改编自论文An FE-Inexact Heterogeneous ADMM for Elliptic Optimal Control Problems with L1-Control Cost { min ⁡ y ( μ ) , u ( μ )...

牛客网项目—开发社区首页

视频连接&#xff1a;开发社区首页_哔哩哔哩_bilibili 代码地址&#xff1a;Community: msf begin 仿牛客论坛项目 (gitee.com) 本文是对仿牛客论坛项目的学习&#xff0c;学习本文之前需要了解Java开发的常用框架&#xff0c;例如SpringBoot、Mybatis等等。如果你也在学习牛…...

uniapp水文【uniapp】

文章目录 1、前言2、历史3、发展4、功能5、优缺点6、总结7、附录7.1、高频使用7.2、使用注意 1、前言 Uniapp是一种跨平台的移动应用开发框架&#xff0c;它允许开发者使用一套代码库&#xff0c;同时生成iOS、Android等多个平台的应用程序。这种技术方案可以大大降低开发成本…...

Java函数式接口

3 函数式接口 3.1 函数式接口概述 函数式接口&#xff1a;有且仅有一个抽象方法的接口 Java中的函数式编程体现就是Lambda表达式&#xff0c;所以函数式接口就是可以适用于Lambda使用的接口只有确保接口中有且仅有一个抽象方法&#xff0c; Java中的Lambda才能顺利地进行推导…...

安装libevent库

安装libevent库 yum install libevent libevent-devel 自动安装Memcached yum install memcached 源码安装 下载1.6.19版本 wget https://www.memcached.org/files/memcached-1.6.19.tar.gz &#xff08;若证书过期yum install -y ca-certificates) 解压源码 tar -zxvf…...

vue 截取字符串的方法

vue中的字符串方法&#xff0c;我目前使用最多的是下面两种方法&#xff0c;因为 vue的字符串方法支持断言操作。 1、 vue中截取字符串的方法如下&#xff1a; 2、 vue中截取字符串的方法&#xff0c;这个方法也是需要依赖于 vue库提供的支持。 3、 vue中截取字符串的方法&…...

可数集和不可数集

有限集和无限集 后继集 设 S S S是任一集合&#xff0c;称 S S ∪ { S } S^ S\cup \left\{ S\right\} SS∪{S}为 S S S的后继集 自然数集 自然数集 N \mathbb{N} N的归纳定义是&#xff1a; &#xff08;1&#xff09; ∅ ∈ N \empty \in \mathbb{N} ∅∈N &#xff08…...

<Linux>《Linux 之 ps 命令详解大全(含实用命令)》

《Linux 之 ps 命令详解大全&#xff08;含实用命令&#xff09;》 1 常用命令1.1 显示所有当前进程1.2 显示所有当前进程1.3 显示所有当前进程1.4 根据用户过滤进程1.5 根据 CPU 使用来升序排序1.6 根据用户过滤进程1.7 查询全10个使用cpu和内存最高的应用1.8 通过进程名和PID…...

华为OD机试真题 Java 实现【寻找关键钥匙】【2023Q1 100分】

一、题目描述 小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定 密码K(升序的不重复小写字母组成)的箱子,并给出箱子编号,箱子编号为1~N。 每个箱子中都有一个字符串s,字符串由大写字母,小写字母,数字,标点符号,空格组成,需要在这些字符串中找出所有的字母…...

项目中遇到的一些问题总结(十三)

extension-configs 和 shared-configs 的区别 在 Nacos 配置管理中&#xff0c;extension-configs 和 shared-configs 分别是两种不同类型的配置&#xff0c;它们的主要区别在于它们的使用场景和作用。 extension-configs 是一种应用程序向 Nacos 注册的扩展配置。它主要用于给…...

药品存销信息管理系统数据设计与实现(包括需求分析,数据库设计,数据表、视图、存储过程等)

前言 可前往链接直接下载: https://download.csdn.net/download/c1007857613/87776664 或者阅读本博文的详细介绍,本博文也包含所有详细内容。 一、需求分析 a.“药品存销信息管理系统”只是对数据库应用技术的一个样本数据库的实例,重在对数据库一些方法的熟悉与掌握,…...

PyTorch-Loss Function and BP

目录 1. Loss Function 1.1 L1Loss 1.2 MSELoss 1.3 CrossEntropyLoss 2. 交叉熵与神经网络模型的结合 2.1 反向传播 1. Loss Function 目的&#xff1a; a. 计算预测值与真实值之间的差距; b. 可通过此条件&#xff0c;进行反向传播。 1.1 L1Loss import torch from …...

centos docker安装mysql8

1、创建挂载文件夹 mkdir -p /mydata/mysql/log mkdir -p /mydata/mysql/data mkdir -p /mydata/mysql/conf 2、拉取镜像最新版本&#xff0c;如果写 mysql:8.0.26可以指定版本 docker pull mysql 3、启动命令 docker run -p 3306:3306 --restartalways -v /mydata/mysql/log:…...

Java中synchronized锁的深入理解

使用范围 synchronized使用上用于同步方法或者同步代码块在锁实现上是基于对象去实现使用中用于对static修饰的便是class类锁使用中用于对非static修饰的便是当前对象锁 synchronized的优化 在jdk1.6中对synchronized做了相关的优化 锁消除 在synchronized修饰的代码块中…...

Find My资讯|iOS17将重点改进钱包、Find My、SharePlay和AirPlay等功能

彭博社的马克・古尔曼&#xff08;Mark Gurman&#xff09;在最新一期 Power On 时事通讯中表示&#xff0c;苹果即将推出的 iOS 17 系统将改进 Wallet、Find My、SharePlay 和 AirPlay 等多项功能。 古尔曼在博文中还表示苹果会增强 Find My 的位置服务&#xff0c;同样也没…...

什么是webSocket?

什么是webSocket WebSockets是一种协议&#xff0c;它允许在Web应用程序中建立持久连接。这意味着当客户端与服务器建立连接后&#xff0c;它们可以始终保持连接状态&#xff0c;直到其中一个终止连接。相比于传统的HTTP协议&#xff0c;WebSockets提供了更高效的方式来处理实…...

黑马Redis视频教程高级篇(一:分布式缓存)

目录 分布式缓存 一、Redis持久化 1.1、RDB持久化 1.1.1、执行时机 1.1.2、RDB原理 1.1.3、小结 1.2、OF持久化 1.2.1、AOF原理 1.2.2、OF配置 1.2.3、AOF文件重写 1.3、RDB与AOF对比 二、Redis主从 2.1、搭建主从架构 2.1.1、集群结构 2.1.2、准备实例和配置 …...

OpenClaw API配置失败?3步快速修复,免费额度高效利用

OpenClaw API配置失败&#xff1f;3步快速修复&#xff0c;免费额度高效利用引言 OpenClaw作为新一代数据采集平台&#xff0c;其API凭借高效稳定的特性已成为开发者首选的工具之一。但在实际接入过程中&#xff0c;配置失败问题频发&#xff0c;尤其对免费额度用户造成严重困扰…...

MAVLink垂直扩展:Emaxx导航板专用协议库设计与实践

1. 项目概述 mavlink_emaxx 是一个面向 Emaxx 导航板&#xff08;Emaxx Nav Board&#xff09;定制的 MAVLink 协议消息扩展库。该库并非独立协议栈&#xff0c;而是基于标准 MAVLink v2 协议规范构建的一组专用消息定义&#xff08;message definitions&#xff09;与配套 C…...

Inconsolata字体高效使用实战指南:提升编程体验的专业字体方案

Inconsolata字体高效使用实战指南&#xff1a;提升编程体验的专业字体方案 【免费下载链接】Inconsolata Development repo of Inconsolata Fonts by Raph Levien 项目地址: https://gitcode.com/gh_mirrors/in/Inconsolata 作为开发者&#xff0c;我们每天与代码打交道…...

intv_ai_mk11应用场景:新媒体运营——热点事件评论草稿、标题党生成、互动话术

intv_ai_mk11在新媒体运营中的三大实战应用 1. 新媒体运营的痛点与AI解决方案 新媒体运营人员每天面临三大核心挑战&#xff1a;快速跟进热点事件、创作吸引眼球的标题、设计有效的互动话术。传统人工创作方式不仅耗时耗力&#xff0c;而且难以保证持续高质量输出。 intv_ai…...

深入解析CC Switch架构:构建AI开发工具统一管理引擎

深入解析CC Switch架构&#xff1a;构建AI开发工具统一管理引擎 【免费下载链接】cc-switch A cross-platform desktop All-in-One assistant tool for Claude Code, Codex, OpenCode, openclaw & Gemini CLI. 项目地址: https://gitcode.com/GitHub_Trending/cc/cc-swit…...

手把手搭建基于Kintex UltraScale+的Cameralink图像处理系统:从LVDS解码到GTY输出HDMI的完整Vivado工程解析

手把手搭建基于Kintex UltraScale的Cameralink图像处理系统&#xff1a;从LVDS解码到GTY输出HDMI的完整Vivado工程解析 在工业视觉和医疗影像领域&#xff0c;Cameralink接口凭借其高带宽和低延迟特性&#xff0c;依然是许多高端相机的首选接口方案。而Xilinx的Kintex UltraSca…...

告别玄学调参:手把手教你用STM32F103和MPU9250实现稳定的EKF姿态解算(附源码)

从理论到实战&#xff1a;STM32F103与MPU9250的EKF姿态解算调参全指南 在嵌入式姿态解算领域&#xff0c;扩展卡尔曼滤波&#xff08;EKF&#xff09;算法因其优异的噪声抑制能力而广受青睐。然而&#xff0c;许多开发者在STM32F103等资源受限平台上实现MPU9250的EKF姿态解算时…...

Video2X:用AI魔法将低分辨率视频变成4K超清大片的终极指南

Video2X&#xff1a;用AI魔法将低分辨率视频变成4K超清大片的终极指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…...

2024电子数据取证实战:从手机取证到恶意APP逆向分析

1. 手机取证实战入门&#xff1a;从ADB到蓝牙MAC地址追踪 手机取证是电子数据取证中最常见的场景之一。去年我参与处理的一起案件中&#xff0c;嫌疑人通过恶意APP窃取了受害者通讯录&#xff0c;当时就是通过ADB连接记录锁定了关键证据。先说说ADB这个基础但极其重要的工具。 …...

从编译错误到版本管理:C语言“商人过河”游戏代码的现代化改造之旅

1. 从古董代码到现代项目&#xff1a;一场技术考古与修复之旅 第一次打开那份"商人过河"的C语言游戏代码时&#xff0c;我仿佛穿越回了二十年前。满屏的编译错误、过时的函数调用、混乱的格式&#xff0c;还有那些早已被现代编译器抛弃的写法。这让我想起刚入行时接手…...