当前位置: 首页 > 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…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

FOPLP vs CoWoS

以下是 FOPLP&#xff08;Fan-out panel-level packaging 扇出型面板级封装&#xff09;与 CoWoS&#xff08;Chip on Wafer on Substrate&#xff09;两种先进封装技术的详细对比分析&#xff0c;涵盖技术原理、性能、成本、应用场景及市场趋势等维度&#xff1a; 一、技术原…...