56课 函数模板的概念和意义

c++之模板 C++ 模板允许用户创建通用的、可重用的代码的方法。常见的 C++ 模板包括函数模板、类模板和模板特化。它允许用户在编写代码时通过类型参数来指定具体的类型。模板的实际实现是在编译时生成代码,因此模板的代码在编译期间被替换为具体类型的代码。 阅读详情

本文学习自 狄泰软件学院 唐佐林老师的 C++课程


思考:C++有几种交换变量的方法?
答:定义宏代码块 vs 定义函数

例1

#include <iostream>
#include <string>

using namespace std;

#define SWAP(t, a, b)    \
do                       \
{                        \
    int c = a;             \
    a = b;               \
    b = c;               \
}while(0)


void Swap(int& a, int& b)
{
    int c = a;
    a = b;
    b = c;
}

void Swap(double& a, double& b)
{
    double c = a;
    a = b;
    b = c;
}

void Swap(string& a, string& b)
{
    string c = a;
    a = b;
    b = c;
}

int main()
{
    int a = 0;
    int b = 1;

    Swap(a, b);

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    double m = 2;
    double n = 3;

    Swap(m, n);

    cout << "m = " << m << endl;
    cout << "n = " << n << endl;

    string d = "Delphi";
    string t = "Tang";

    Swap(d, t);

    cout << "d = " << d << endl;
    cout << "t = " << t << endl;

    return 0;
}

在这里插入图片描述

小结

定义宏代码块
优点:代码复用,适合所有的类型
缺点:编译器不知道宏的存在,缺少类型检查

定义函数
优点:真正的函数调用,编译器对类型进行检查
缺点:根据类型重复定义函数,无法代码复用

问题:C++有没有解决方案可以集合上述两种方法的优点?

泛型编程的概念

  • 不考虑具体函数类型的编程方式

对于 Swap函数可以考虑下面的泛型写法

void Swap(T& a, T& b)
{
	T t = a;
	a = b;
	b = t;
}

Swap泛型写法中的T不是一个具体的数据类型,而是泛指任意的数据类型。

C++中的泛型编程

  • 函数模板
    • 一种特殊的函数,可用不同类型进行调用。
    • 看起来和普通函数很相似,区别是类型可被参数化。

在这里插入图片描述
函数模板的语法规则

  • template关键字用于声明开始进行泛型编程
  • typename关键字用于声明泛指类型
    在这里插入图片描述
    函数模板的使用
  • 自动类型推导调用
  • 具体类型显示调用
int a = 0;
int b = 1;

Swap(a, b); //自动推导

float c = 2;
float d = 3;

Swap<float>(c, d); //显示调用

例2

#include <iostream>
#include <string>

using namespace std;

template < typename T >
void Swap(T& a, T& b)
{
    T c = a;
    a = b;
    b = c;
}

template < typename T >
void Sort(T a[], int len)
{
    for(int i=0; i<len; i++)
    {
        for(int j=i; j<len; j++)
        {
            if( a[i] > a[j] )
            {
                Swap(a[i], a[j]);
            }
        }
    }
}

template < typename T >
void Println(T a[], int len)
{
    for(int i=0; i<len; i++)
    {
        cout << a[i] << ", ";
    }

    cout << endl;
}

int main()
{
    int a[5] = {5, 3, 2, 4, 1};

    Println(a, 5);
    Sort(a, 5);
    Println(a, 5);

    string s[5] = {"Java", "C++", "Pascal", "Ruby", "Basic"};

    Println(s, 5);
    Sort(s, 5);
    Println(s, 5);

    return 0;
}

在这里插入图片描述

总结

  • 函数模板是泛型编程在C++中的应用方式之一
  • 函数模板能够根据实参对参数类型进行推导
  • 函数模板支持显示的指定参数类型
  • 函数模板是C++中重要的代码复用方式

函数模板的概念和应用 函数模板的概念与应用 函数模板的定义与使用方法 用函数模板实现求n个不同类型的数据的最小值 立即下载

相关推荐

Ubuntu中交叉编译armadillo库

网上关于交叉编译armdillo库比较少,借鉴了一些但是在前几天编译时总是磕磕绊绊,于是写一个详细的编译过程。交叉编译armdillo库包含两个步骤:交叉编译依赖库和交叉编译armdillo库。

weixin_39813867的博客 1879

函数模板的应用

利用函数重载可以实现多态性。例如在计算两个数相加时,无论两个整数相加还是实数相加,只需要调用一个函数即可以实现。但是,它需要用户定义两个同名函数。利用函数模板,用户可以涉及一个通用的函数,实现两个整数或者两个实数的相加。 例:定义一个模板函数add,实现两个数的相加。 #include <iostream> template<class T>T add(T one,T...

qq_24499417的博客 643

别再只调颜色阈值了!优化K210色块追踪性能的5个关键参数与实战技巧

本文深入探讨了K210色块追踪性能优化的五大核心策略,包括图像预处理参数精细调控、find_blobs参数进阶配置、运动控制算法升级、硬件时序优化以及可视化调试系统构建。通过实战技巧和参数调整方法,帮助开发者提升K210在色块追踪项目中的识别稳定性和响应速度,适用于云台追踪等应用场景。

weixin_42531588的博客 225

初识及C++模板,总结函数模板的特点以及具体使用_c加加模板函数有啥用

建立一个通用函数,其函数返回值和形参类型可以不具体绑定,用户一个虚拟类型先代表。模板必须确定出T的数据类型,才可以使用。第一行测试调用同一个函数名,编译器优先调用的是模板函数还是普通函数。T:通用的数据类型,通常为字母大小写,可更换。1、普通函数模板和普通函数都可以调用的话优先调用普通函数。4、如果函数模板可以产生更好的匹配,优先调用函数模板。2、函数模板 用自动类型推导,不会发生隐式类型转换。3、函数模板 用显示指定类型,可以发生隐式类型转换。--表明其后面的符号是一种数据类型,可以用。

2501_90433463的博客 573

可信数据空间关键技术和功能架构研究

可信数据空间(TDS)是实现数据安全共享的基础设施,通过数字合约和使用控制技术确保数据跨域流通的可信与安全。其架构包括服务平台和接入连接器,关键技术涵盖访问控制、隐私计算、区块链等。评估重点在于合规性、连接器能力、互联互通及安全体系。核心在于构建规则引擎而非简单数据汇聚,连接器开发比平台建设更重要。当前面临技术成本博弈、跨域身份互认等挑战,需平衡安全、性能与成本,推动数据要素市场发展。

逸尘的专栏 2223

【环境搭建】使用openSfM+MVSNet重建稠密点云

本帖详细介绍了如何使用openSfM+MVSNet对真实采集的数据进行稀疏重建与稠密重建,并针对一些真实场景下可能遇到的问题进行了整理。

YuhsiHu的博客 1971

函数模板的使用

函数模板还是比较强大的,大家都知道函数模板可以增加代码的复用性,提高编程效率。但殊不知函数模板其实还分为三种情况,隐式实例化、显式实例化、显示具体化。下面逐一来说明。 (1)隐式实例化 最常使用的函数模板形式,在使用模板之前,编译器不生成模板的声明和定义实例。只有当使用模板时,编译器才根据模板定义生成相应类型的实例。 (2)显式实例化 当显式实例化模板时,在使用模板之前,编译器根据显式实例化指定的类型生成模板实例。这样做会提高代码执行的效率,就不用了在每次调用时去推导参数类型。 (3)显式具体化

littlecorner1205的博客 5010

【微知】关于GB200 NVL72服务器的一些信息?(36CPU72GPU;LPDDR5X 17T;HBM3e 13.5T;5代NVlink 1.8TB; 720P算力FP8;120Kw)

本文仅根据官网介绍分析,存在纰漏仅供参考。

技术札记 5385

函数模板

函数模板相关概念1、函数模板的意义:2、重载函数模板3、显式具体化的模板4、同名函数的调用优先级5、(!划重点)编译器匹配规则6、创建自定义选择 相关概念 实例化:编译器由函数模板再结合具体调用时的传参(实参),生成对应的函数 具体化:定义一个有具体类型的形参的函数模板,具体见(3) 重载:即函数名相同但函数特征标(function signature)不同 函数特征标:仅指函数形参的个数、类型、顺序的不同,与函数的返回类型没一毛钱关系 1、函数模板的意义: 对于只有参数类型不同,功能几乎相同的多

Baual的博客 279

python实现MACD策略背离点的判断 (附完整源码)

python实现MACD策略背离点的判断 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 665

【LOGO动态替换】记录一次关于LOGO动态替换引发的uboot代码分析及其实现

文章目录1.前言2.实现2.1 新增logo分区2.2 制作logo分区镜像2.2.1 查看logo.bmp和logo_kernel.bmp的文件大小。2.2.2 按规则将bmp写入logo.img3.分析3.1 uboot的启动分析3.2 uboot bmp load 显示部分3.2.1 rockchip_show_logo3.2.2 load_bmp_logo3.2.3 load_bmp_logo3.3 uboot bmp read部分3.3.1 read_logo_bmps3.3.1 read_bmp

wang 恒 的博客 1213

第56课 函数模板的概念和意义

发散性问题: C++有几种交换变量的方法? 定义宏代码块与函数: 实验: 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 #define SWAP(t, a, b) \ 7 do ...

diaozhiwa5526的博客 137

使用 Simulink/Simscape Electrical/Stateflow,构建一个并网逆变器短路故障动态响应与恢复策略仿真模型

本文基于Simulink平台,详细介绍了并网逆变器短路故障的动态响应与恢复策略仿真方法。主要内容包括:1)构建包含热模型的高精度逆变器模型;2)模拟IGBT击穿和桥臂直通两种短路故障;3)设计基于Stateflow的微秒级快速保护逻辑;4)实现放电、去磁、自检、重启的完整恢复流程。仿真结果表明,所提出的保护方案能在200μs内有效限制故障电流,避免器件永久损坏,并通过标准化恢复流程实现系统安全重启。文章还探讨了硬件保护协同、多级保护和预测保护等高级策略,为电力电子系统安全防护提供了实用解决方案。

xiaoheshang_123的博客 107

第56课 函数模板的概念和意义

本文内容来自于对狄泰学院 唐佐林老师 C++深度解析 课程的学习总结 交换变量的方法 定义宏代码块 VS 定义函数 #include <iostream> #include <string> using namespace std; /* 使用宏来完成变量交换 */ #define SWAP(t, a, b) \ do \...

lzg2011的博客 207

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++第56课--函数模板的概念和意义

本文学习自 狄泰软件学院 唐佐林老师的 C++课程 引子: 之前学习的C/C++中至少有两种交换变量的方式,分别是宏代码块和函数,但是他们有各自的缺陷,宏由于是在预处理阶段替换的,所以编译器不知道宏的存在,缺少类型检查。而定义函数的话,虽然编译器可以进行类型检查,但是却需要根据类型重复定义函数,无法代码复用。由此,C++ 推出了 泛型编程的概念(函数模板,类模板),不考虑具体数据类型的编程方式。...

奶牛养殖场小马 334

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

第56课.函数模板的概念和意义

1.泛型编程 概念:不考虑具体数据类型的编程方式 函数模板: template关键字用于声明开始进行泛型编程typename关键字用于声明泛指类型 template <typename T> // template : 告诉编译器开始泛型编程 // typename : 告诉编译器T是一个泛指类型 void Swap (T& a, T& b) { T t =...

二手水滴的博客 60

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

第56课 函数模板的概念和意义

1、发散性问题:C++中的几种交换变量的方法。     1.1、宏代码块 VS 函数 /**************           变量的交换        *************/ #include #include using namespace std; //宏定义代码块 #define SWAP(t, a, b)\ do              

中年人 250

56-函数模板的概念和意义

注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。 测试环境:Ubuntu 10.10 GCC版本:9.2.0 进入泛型编程的世界:实际工程中必用的技术,函数模板和类模板就是泛型编程技术。 一、发散性问题 C++中有几种交换变量的方法? 二、交换变量的方法 定义宏代码块 VS 定义函数 编程实验 变量的交换 56-1.cpp #include <iostream> #include <stri...

第一大剑豪——索隆 218

【C++】 56_函数模板的概念和意义

C++ 中有几种交换变量的方法? 交换变量的方法 定义宏代码块 定义函数 编程实验: 变量的交换 #include <iostream> #include <string> using namespace std; #define SWAP(t, a, b) \ { ...

weixin_34345753的博客 106

56、函数模板的概念和意义

1、发散性的问题: C++中有几种交换变量的方法? 答:两种,定义宏代码块 VS 定义函数 #define SWAP(t,a,b) \ { \ t c = a; \ a = b; \ b = c; \ } void Swap(int& a, int& b) { int c = a; a...

xiebs的博客 472

[lesson56]函数模板的概念和意义

定义宏代码块代码复用缺少类型检查定义函数真正的函数调用无法代码复用。

James的博客 278

56 - 函数模板的概念与意义

56 - 函数模板的概念与意义

嵌入式wu 194

C++中函数模板的概念和意义

1,对泛型编程进行学习,泛型编程是实际工程开发中必用的技术,大型公司的通用 库都是采用泛型编程的技术完成的,C++ 中支持泛型编程技术,C++ 中的函数 模板和类模板就是 C++ 中泛型编程技术,本文分析 C++ 中的模板; 2,每一样技术 的引入都是为了解决一定的问题,下面将通过一个例子让大家意识到问题的存在,才能体会泛型编程的精妙之处; 3,C++ 中有几种交换...

355

C++学习笔记 第56课 函数模板的概念与意义

发散性问题:C++有多少种交换变量的方法? 通过前面的学习,我们可以知道,可以使用宏代码块和函数的方法进行代码交换。 #include <iostream> #include <string> using namespace std; #define SWAP(t, a, b) \ do { \ t c = a; \ a = b; \ b = c; \ }while(0) void Swap(int& a, int&amp

weixin_43824344的博客 219
上一篇: MMC子系统识别SD设备过程简述
下一篇: 57课 深入理解函数模板
Ma浩然
博客等级 码龄9年 1万+粉丝 462原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值