C++中的函数模板

news2025/1/12 21:01:29

目录

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为int
        print("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++ 库的开发通常需要使用到类模板。库的设计者需要考虑到用户可能会使用不同类型的数据,因此要使用类模板来实现泛型。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32的SPI外设

文章目录 1. STM32 的 SPI 外设简介2. STM32 的 SPI 架构剖析2.1 通讯引脚2.2 时钟控制逻辑2.3 数据控制逻辑2.4 整体控制逻辑 3. 通讯过程4. SPI 初始化结构体详解 1. STM32 的 SPI 外设简介 STM32 的 SPI 外设可用作通讯的主机及从机&#xff0c;支持最高的 SCK 时钟频率为 …

语义分割实战项目(从原理到代码环境配置)

MMsegmentation是一个基于PyTorch的图像分割工具库,它提供了多种分割算法的实现,包括语义分割、实例分割、轮廓分割等。MMsegmentation的目标是提供一个易于使用、高效、灵活且可扩展的平台,以便开发者可以轻松地使用最先进的分割算法进行研究和开发。 看下结果 MMsegmenta…

安卓基础巩固(三)多线程、IO操作、数据存储

文章目录 多线程Handler相关概念UI线程/主线程MessageMessage QueueLooperHandler 使用步骤Handler.sendMessage&#xff08;&#xff09;Handler.post&#xff08;&#xff09; Handler 机制工作原理Handler内存泄露前置知识案例分析解决方案一&#xff1a;静态内部类弱引用解…

day09 MyBatis基础操作

为什么使用框架 框架的作用:可以直接调用写好的API,提高开发效率,框架是一种经过校验,有一定功能的半成品软件 为什么选择mybatis框架 它几乎避免了所有的JDBC的代码和手动设置参数及获取结果集.作用于持久层,支持定制化sql,存储过程及高级映射 项目所需要的jar包: lombok…

PowerShell系列(四):PowerShell进入交互环境的三种方式

目录 1、Win键X 方式 2、使用微软自带的搜索功能 3、命令行运行方式 4、命令行窗口方式 5、使用第三方命令行软件&#xff08;Terminal&#xff09;开启PowerShell环境 6、PowerShell交互环境执行脚本的一些优势 7、小技巧 今天继续给大家讲解PowerShell相关的知识&…

IMX6ULL裸机篇之DDR3实验-更新 imxdownload.h

一. DDR实验 之前关于 IMX6ULL开发板&#xff0c;有关DDR实验。做了DDR内存芯片的初始化&#xff0c;校验与超频测试。 博文链接如下&#xff1a; IMX6ULL裸机篇之DDR3初始化_凌雪舞的博客-CSDN博客 IMX6ULL裸机篇之DDR3校验与超频测试_凌雪舞的博客-CSDN博客 经过了初始化…

C Primer Plus第二章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 1.编写一个程序&#xff0c;调用一次 …

【Linux系列P3】Linux的权限有什么重点?一文带你理清!

前言 大家好&#xff0c;这里是YY的Linux系列part3&#xff1b;本章主要内容面向能使用Linux的老铁&#xff0c;主要内容是【Linux的用户&用户指令】【文件属性】【权限&权限值的两者表达方式】【权限相关指令】【起始权限问题与掩码问题】【粘滞位的概念与特殊权限-t解…

[Ext JS3.9] 标签面板(TabPanel )介绍与开发

标签面板 标签面板是RIA 类应用使用较多的组件, 因为其可以显示的内容比较多。 标签面板的效果如下图: 标签面板开发也很简单, 配置式的开发代码类似: {xtype: tabpanel,items: [{title: 标签页1,html:标签页1内容}, {title: 标签页2,html:标签页2内容}, {title: 标签页…

【教学类-34-05】拼图(数字学号0X-长方块拼图-双色深灰浅灰)3*3格子(中班主题《个别化拼图》偏艺术-美术)

作品展示 背景需求 难点&#xff1a;如何让生成图片带两个颜色的数字&#xff1f; 上一次学习活动中&#xff0c;发现03、04、05、06、08、09 、 23、26、28拼图都有困境&#xff0c;教师帮助。这些数字都包含圆弧结构&#xff0c;幼儿对于大量的圆弧碎片图形的多重组合&…

【Java-Crawler】一文学会使用WebMagic爬虫框架

WebMagic 爬虫主要分为采集、处理、存储三个部分。 在学 WebMagic 框架之前&#xff0c;需要了解 HttpClient、Jsoup&#xff08;Java HTML Parse&#xff09; 库&#xff0c;或者说会他们的基本使用。因为 WebMagic 框架内部运用了他们&#xff0c;在你出现问题看源码去查错时…

MySQL主从复制配置

一、MySQL主从概念 MysSQL主从复制是一个异步的复制过程&#xff0c;底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台AysQL数据库(slave&#xff0c;即从库&#xff09;从另一台MysQL数据库(master&#xff0c;即主库&#xff09;进行日志的复制然后再解析日志并应…

一、尚医通排班管理

文章目录 一、排班管理1、页面效果2、接口分析3、实现分析 二、排班管理实现1、科室列表1.1 api接口1.1.1 添加service接口与实现1.1.2 添加controller接口 1.2 科室前端1.2.1 添加路由1.2.2 添加按钮1.2.3封装api请求1.2.4 部门展示 2、排班日期分页列表2.1 api接口2.1.1 添加…

Net跨平台UI框架Avalonia入门-DataGrid的使用

Avalonia中的DataGrid的使用 DataGrid 数据表格是客户端UI中很重要的一个控件&#xff0c;Avalonia中的DataGrid是单独一个包Avalonia.Controls.DataGrid&#xff0c;要使用DataGrid&#xff0c;需要另外在Nuget中按这个包&#xff0c;下面介绍一下DataGrid的安装和使用 Data…

android/ios 一键抽取硬编码字符串

由于老项目 做国际化困难,抽取繁琐 最终实在蛋疼 最终开放插件来解决 android studio 插件 一键抽取硬编码字符串 xcode 一键抽取硬编码字符串 环境配置android studio ,appcode idea 环境类似1.安装插件 插件下载点击 2. 配置生成文件路径 android 就是string.xml ios Loca…

搭建stm32电机控制代码框架(一)

也是挑战一下自己吧&#xff0c;看看多久能够把自己的代码框架搭建起来&#xff0c;今天是5月23日&#xff0c;看看最终搭建成功的时候是什么时候&#xff0c;目标其实这个阶段很简单&#xff0c;电机转一个双闭环FOC就行。 这次的任务是基于stm32f405芯片进行展开&#xff0c…

STM32单片机(一)STM32简介

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

国产FPGA选型指南:如何选择适合你的国产FPGA芯片?

FPGA自1985年由Xilinx的创始人之一Ross Freeman发明后&#xff0c;全球90%的FPGA市场一直被国外厂家所占有&#xff0c;主要是这四家公司&#xff1a;Xilinx、Altera、Lattice、Microsemi。 Xilinx 和Altera公司占据了全球近80%以上的市场份额&#xff0c;且拥有着FPGA领域绝大…

Java学习笔记20——内部类

内部类 内部类的访问特点内部类的形式成员内部类局部内部类匿名内部类匿名内部类在开发中使用 内部类是类中的类 内部类的访问特点 1.内部类可以直接访问外部类的成员&#xff0c;包括私有成员 2.外部要访问内部类的成员&#xff0c;必须创建对象 内部类的形式 成员内部类 …

java变量类型

文章目录 一、java变量类型一.java变量类型二、Java 参数变量三、Java 局部变量四、成员变量&#xff08;实例变量&#xff09;五、类变量&#xff08;静态变量&#xff09; 总结 一、java变量类型 一.java变量类型 在Java语言中&#xff0c;所有的变量在使用前必须声明。声明…