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

C++中的函数模板

目录

1. 什么是函数模板?

2. 如何定义函数模板?

3. 如何使用函数模板?

4. 函数模板与函数重载的区别是什么?

5. 函数模板与类模板有何异同点?


1. 什么是函数模板?

- 函数模板是一种通用的函数描述,可以定义多个同名函数,以适应不同类型的参数。

如果在 C++ 中,也能够存在这样一个 模具 ,通过给这个模具中 填充不同材料 ( 类型 ) ,来 获得不同材料的铸件
( 即生成具体类型的代码) ,那将会节省许多头发。巧的是前人早已将树栽好,我们只需在此乘凉。
泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

 

2. 如何定义函数模板?

- 使用 template 关键字定义模板函数,语法为:```template <typename T>returnType functionName(T arg1, T arg2, ...){// function body}```
- typename 是一个关键字,表示类型参数。
- T 是函数的类型参数,可以是任何合法的 C++ 数据类型,包括内置类型和自定义类型。

3. 如何使用函数模板?

- 在调用函数时,编译器会根据实参类型确定调用哪个函数模板,语法如下:```functionName<type>(arg1, arg2, ...)```
- type 表示实参的数据类型,必须与函数模板中的类型参数 T 匹配。

以下时使用函数模板的示例:

  1. 定义一个函数模板

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

    这个函数模板定义了一个名为 maximum 的函数,它有两个类型参数。它可以比较任意类型的值,并返回其中的最大值。

  2. 实例化函数模板

    我们可以通过在函数名后面加上尖括号 <T> 来实例化函数模板,并指定类型参数 T 的具体类型。例如:

    int max_int = maximum<int>(3, 5);
    double max_double = maximum<double>(2.5, 1.8);
    

    在第一行代码中,我们以 int 类型实例化了 maximum 函数模板,并将其应用于整数值 3 和 5。编译器会生成一个具体的函数实现,比较这两个整数值并返回其中的最大值。

    在第二行代码中,我们以 double 类型实例化了 maximum 函数模板,并将其应用于浮点数值 2.5 和 1.8。编译器同样会生成一个具体的函数实现,比较这两个浮点数值并返回其中的最大值。

  3. 自动推导类型                                                                                                                          在C++函数模板实例化时,编译器会根据传入的实参类型来自动推导出模板形参的类型。    例如:

  4. template<typename T>
    void print(T value) {std::cout << value << std::endl;
    }int main() {print(10); // 推导出T为intprint("hello"); // 推导出T为const char*return 0;
    }
    

    在上述代码中,当我们调用print(10)print("hello")时,编译器会自动推导出T分别为intconst char*。然后根据这个T类型实例化出对应的函数模板。最终编译器将生成如下的代码:

    void print(int value) {std::cout << value << std::endl;
    }void print(const char* value) {std::cout << value << std::endl;
    }

4. 函数模板与函数重载的区别是什么?

- 函数重载是指在同一个作用域内定义多个同名函数,但它们的参数数量或类型不同。
- 函数模板是一种通用的函数描述,可以定义多个同名函数,以适应不同类型的参数。

通过函数模板生成的不同的函数之间是具有重载关系的。

具体来说,当我们使用函数模板时,编译器会根据实参的类型来确定最终调用的函数。如果有多个函数模板可以匹配实参类型,编译器会根据一定的匹配规则选择最合适的函数模板。如果最终的匹配结果对应的函数模板已经被实例化,那么就会调用相应的函数实现;否则,编译器会根据该类型参数的具体类型生成一个新的函数实现,并将其添加到重载候选函数集中。

因此,通过函数模板生成的不同函数之间是具有重载关系的,它们可以通过重载分辨符 operator() 来区分。例如,对于以下的函数模板:

template<typename T>
T add(T a, T b) {return a + b;
}

当我们分别调用 add(1, 2) 和 add(3.0f, 4.0f) 时,编译器会生成两个不同的函数实现:

int add(int a, int b) {return a + b;
}float add(float a, float b) {return a + b;
}

这两个函数之间就具有函数重载关系。

5. 函数模板与类模板有何异同点?

- 函数模板和类模板都是泛型编程的工具。
- 函数模板是用来生成函数的,类模板是用来生成类的。
- 函数模板中的类型参数可以应用于函数的参数、返回值和局部变量;类模板中的类型参数只能应用于类的成员变量和成员函数。
  1. 函数模板的一些常见使用场景:
    • 容器类的泛型算法,如 STL 中的 sort()、find() 等。
    • 数学库中的数值计算函数,如求平方根、幂函数等。
    • 模板元编程,即使用模板来实现某些编译时的计算或操作。
  2. 类模板是一种通用的类描述,可以根据不同的类型参数生成多个具体的类实现。下面是类模板的一些常见使用场景:

    1. 容器类的泛型实现:STL 中的 vector、list、map 等容器都是通过类模板实现的。这些容器类需要支持不同类型的元素,因此需要通过类型参数来实现泛型。

    2. 模板化算法:与容器类相似,许多算法也需要支持不同类型的数据。例如,可以用类模板来实现排序、查找、匹配等算法。

    3. 模板元编程:模板元编程是指利用 C++ 模板系统进行编译时计算的技术。可以通过类模板来实现许多元编程技巧,例如在编译期计算阶乘、斐波那契数列、类型列表等。

    4. 设计模式:设计模式是一些经过验证的、可复用的解决方案,用于解决软件设计中的常见问题。类模板是实现许多设计模式的基础,如单例模式、策略模式、桥接模式、享元模式等。

    5. 库的开发:C++ 库的开发通常需要使用到类模板。库的设计者需要考虑到用户可能会使用不同类型的数据,因此要使用类模板来实现泛型。

相关文章:

C++中的函数模板

目录 1. 什么是函数模板&#xff1f; 2. 如何定义函数模板&#xff1f; 3. 如何使用函数模板&#xff1f; 4. 函数模板与函数重载的区别是什么&#xff1f; 5. 函数模板与类模板有何异同点&#xff1f; 1. 什么是函数模板&#xff1f; - 函数模板是一种通用的函数描述&…...

MapReduce【Shuffle-Combiner】

概述 Conbiner在MapReduce的Shuffle阶段起作用&#xff0c;它负责局部数据的聚合&#xff0c;我们可以看到&#xff0c;对于大数据量&#xff0c;如果没有Combiner&#xff0c;将会在磁盘上写入多个文件等待ReduceTask来拉取&#xff0c;但是如果有Combiner组件&#xff0c;我们…...

postman接口自动化测试

Postman除了前面介绍的一些功能&#xff0c;还有其他一些小功能在日常接口测试或许用得上。今天&#xff0c;我们就来盘点一下&#xff0c;如下所示&#xff1a; 1.数据驱动     想要批量执行接口用例&#xff0c;我们一般会将对应的接口用例放在同一个Collection中&#xf…...

历经70+场面试,我发现了大厂面试的套路都是···

今年的金三银四刚刚过去&#xff0c;我又想起了我在去年春招时面试了50余家&#xff0c;加上暑期实习面试了20余家&#xff0c;加起来也面试了70余场的面试场景了。 基本把国内有名的互联网公司都面了一遍&#xff0c;不敢说自己的面试经验很丰富&#xff0c;但也是不差的。 …...

可视区域兼容性问题的思考及方法封装

今日在复习可视化尺寸获取时突发奇想&#xff0c;为什么要在怪异模式下使用document.body.clientWidth&#xff0c;在标准模式下使用document.documentElement.clientWidth&#xff1f;以及是否在IE8及以下的版本中其中一个获取方式将返回undefined或0。  出于该问题的思考&am…...

安全工具 | CMSeeK [指纹识别]

0x00 免责声明 本文仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担…...

Android新logcat使用技巧

Android新logcat使用技巧 logcat新UI出现后&#xff0c;我常困惑于怎么过滤log&#xff0c;和以前的UI差异比较大&#xff0c;新UI界面结构如下&#xff1a; 这个新的 logcat 的问题是如何过滤信息并不是很明显。 获取应用的日志信息 要获取我们当前调试应用的日志信息&…...

使用Makefile笔记总结

文章目录 一、简单了解Makefile1.1 Makefile示例1.2 基本规则1.3 make是如何工作的1.4 使用变量1.5 make自动推导 二、变量2.1 变量的定义和引用2.2 变量的两种高级用法2.3 override 和 define 关键字2.4 环境变量与目标变量2.5 自动变量 三、Makefile规则3.1 通配符3.2 目标依…...

npm下载依赖项目跑不起来--解决方案

code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: vue-element-admin4.4.0 npm ERR! Found: webpack4.46.0 npm ERR! node_modules/webpack npm ERR! webpack“^4.23.0” from the root project npm ERR! npm ERR! Coul…...

SolVES模型生态系统服务功能社会价值评估

查看原文>>>SolVES 模型生态系统服务功能社会价值评估&#xff08;基于多源环境QGIS、PostgreSQL、ArcGIS、Maxent、R语言&#xff09; 目录 第一章、理论基础与研究热点 第二章、SolVES 4.0 模型运行环境配置 第三章、SolVES 4.0 模型运行 第四章、数据获取与入…...

Godot引擎 4.0 文档 - 入门介绍 - 学习新功能

本文为Google Translate英译中结果&#xff0c;DrGraph在此基础上加了一些校正。英文原版页面&#xff1a; Learning new features — Godot Engine (stable) documentation in English 学习新功能 Godot 是一个功能丰富的游戏引擎。有很多关于它的知识。本页介绍了如何使用…...

如何进行MySQL漏洞扫描

MySQL是一款广泛使用的关系型数据库管理系统&#xff0c;但由于其复杂的结构和功能&#xff0c;也存在不少安全漏洞&#xff0c;容易被黑客攻击。为了解决这些安全问题&#xff0c;进行MySQL漏洞扫描是必要的。那么MySQL怎么进行漏洞扫描?如何进行漏洞扫描?接下来就让小编带大…...

C语言函数大全-- x 开头的函数(3)

C语言函数大全 本篇介绍C语言函数大全-- x 开头的函数 1. xdr_opaque 1.1 函数说明 函数声明函数功能bool_t xdr_opaque(XDR *xdrs, char *buf, u_int len);用于编码或解码任意长度的二进制数据 参数&#xff1a; xdrs &#xff1a; 指向 XDR 数据结构的指针&#xff0c;表…...

计算机图形学-GAMES101-12阴影

Shadow mapping 问题的提出 我们之前在进行着色时&#xff0c;对于每个物体仅考虑自己&#xff0c;而不考虑其他物体对它的影响。限定在光栅化中&#xff0c;如何解决阴影问题呢&#xff1f;阴影能被摄像机看到&#xff0c;但不能被光源所照亮。经典的Shadow mapping只能处理…...

iOS_Swift高阶函数

iOS_Swift高阶函数 #mermaid-svg-NxX1czIESDq47OQw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NxX1czIESDq47OQw .error-icon{fill:#552222;}#mermaid-svg-NxX1czIESDq47OQw .error-text{fill:#552222;stroke:#…...

探索Vue的组件世界-组件复用

目录 Mixin【混入】 缺陷 HOC&#xff08;higher order component&#xff09;【高阶组件】 相比较Mixin的优点&#xff1a; 不足&#xff1a; Renderless组件【函数式组件&#xff0c;无渲染组件&#xff0c;Vue社区使用比较多的一种业务复用模式】 优点&#xff1a; M…...

OMA通道-2

1 简介 本文档中指定的 API 使移动应用程序能够访问移动设备中的不同 SE&#xff0c;例如 SIM 或嵌入式 SE。 本规范提供了接口定义和 UML 图&#xff0c;以允许在各种移动平台和不同的编程语言中实现。 如果编程语言支持命名空间&#xff0c;则它应为 org.simalliance.openmob…...

SAP 用CO13冲销工序报工,但是没有产生货物移动(TCODE:CO1P 、 SE38 :CORUPROC,CORUAFWP)

前言 通常情况下&#xff0c;对PPO做GI或GR的时候&#xff0c;出现的异常可以在COGI中间被列出&#xff1b;在这些数据进入COGI之前&#xff0c;系统会把这些数据记录在CO1P中&#xff1b;换句话说&#xff0c;系统有时会出现DB的更新延时&#xff0c;当延时发生的时候&#xf…...

信息收集-服务器信息

服务器上面可以运行大量的系统服务和第三方应用服务&#xff0c;如果操作系统或者第三方软件没有及时升级打补丁&#xff0c;攻击者就有可能直接通过服务器上运行的服务进行攻击。 服务器需要收集的信息包含三个方面&#xff1a; 操作系统信息等识别waf&#xff08;Web应用程…...

连续签到积分兑换试用流量主小程序开发

每日签到积分兑换试用流量主小程序开发 打卡兑奖小程序。用户签到活得积分。积分可以兑换商品。观看激励视频广告可以积分翻倍。 用户可以参加试用商品活动参加试用需要提交信息。可以通过分享方式直接获取试用资格。 以下是流量主小程序的功能列表&#xff1a; 广告位管理&a…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...