【C++奇遇记】函数模板

news2024/11/15 17:42:23

🎬 博客主页:博主链接
🎥 本文由 M malloc 原创,首发于 CSDN🙉
🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构
🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📆 未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述
在这里插入图片描述

文章目录

  • 😇本章详情
  • 😇函数模板的前情介绍
  • 😇利用函数模板来定义交换函数
    • 📝建立交换模板
  • ✉重载的模板
  • 📋模板的局限性
  • 😇显示具体化
  • 📃如何巩固学习
  • 📃本文小结

😇本章详情

🐤本篇文章将讲授C++的函数模板相关的知识

😇函数模板的前情介绍

😁现在的C++编译器实现了C++新增的一项特性—函数模板。函数模板。函数模板是通用的函数描述,也就是说,它们使用泛型来定义函数,其中的泛型可用具体的类型(如int或double)替换。通过将类型作为参数传递给模板,可使编译器生成该类型的函数。由于模板允许以泛型(而不是具体类型)的方式编写程序,因此有时也被称为通用编程。由于类型是用参数表示的,因此模板特性有时也被称为参数化类型。

😇利用函数模板来定义交换函数

📝建立交换模板

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

解析

第一行指出,要建立一个模板,并将类型命名为T。关键字template和typename是必需的,除非可以使用关键字class代替typename。另外,必须使用尖括号。类型名可以任意选则(这里为T),只要遵守C++命名规则即可。模板并不创建任何函数,而只是告诉编译器如何定义函数。需要交换int的函数时,编译器将按模板模式创建这样的函数,并用int代替T。同样交换double的函数时,编译器将按模板模式创建这样的函数,并有double代替T。


C++98之前的定义方式
在标准C++98添加关键字typename之前,C++使用关键字class来创建模板

template<class T>
void swap(T& a,T& b)
{
	T temp;
	temp = a;
	a = b;
	b = temp;
}

typename关键字使得参数T表示类型这一点更为明显;然而,有大量的代码库是使用关键字class开发的。这两种关键字等价的。

✉重载的模板

💐需要多个对不同类型使用同一种算法的函数时,可使用模板,然而并且所有的类型都使用相同的算法。为满足这种需求,可以向重载常规函数定义那样重载模板定义。和常规重载一样,被重载的模板的函数特征标必须不同。例如,在下方代码中新增了一个交换模板,用于交换两个数组中的元素。原模板的特征标为(T&, T&),而新模板的特征标为(T[], T[], int)。在后一个模板中,最后一个参数的类型为具体类型int,而不是泛型。并非所有的模板参数都必须是模板参数类型。


代码演示

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<list>
using namespace std;
template <typename T>
void Swap(T& a,T& b);// new templatetemplate 

template <typename T>
void Swap(T *a,T *b,int n);

void Show(int a[]); 
const int Lim = 8; 
int main()
{
	int i = 10, j = 20;
	cout << "i, j =" << i << ", " << j << "\n";
	Swap(i, j);
	cout << i << j << endl;

	int d1[Lim] = { 0,7,0,4,1,7,7,6 };
	int d2[Lim] = { 0,7,2,0,1,9,6,9 };
	cout << "original arrays:\n";
	Show(d1);
	Show(d2);
	Swap(d1, d2, Lim);
	cout << "Swapped array:\n";
	Show(d1);
	Show(d2);

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

template <typename T>
void Swap(T a[], T b[], int n)
{
	T temp;
	for (int i = 0; i < n; i++)
	{
		temp = a[i];
		a[i] = b[i];
		b[i] = temp;
	}
}

void Show(int a[])
{
	cout << a[0] << a[1] << "/";
	cout << a[2] << a[3] << "/";
	for (int i = 4; i < Lim; i++)
	{
		cout << a[i];
	}
	cout << endl;
}
	

输出
在这里插入图片描述

📋模板的局限性

💐假设有如下模板函数:

template <class T>
void f(T a,T b)
{}

通常,代码假定可执行那些操作。例如,下面的代码假定定义了赋值,但
如果T为数组,这种假设将不成立:

a = b

同样,下面的语句假设定义了>,但如果T 为结构,该假设便不成立:

if(a>b)

另外,为数组名定义了运算符>,但由于数组名为地址,因此他比较的是数组的地址,而这可能不是您希望的。

注意

名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。因此,在默认的情况下,在名称空间中声明的名称的链接性为外部的(除非它引用了常量)

😇显示具体化

📖假设定义了如下结构:

struct job
{
	char name[40];
	double salary;
	int floor;-
};

🌼;另外,假设希望能够交换两个这种结构的内容。原来的模板使用下面的代码来完成交换:

temp = a;
a = b;
b = temp;

由于C++允许将一个结构赋给另一个结构,因此即使T是一个job结构,上述代码也适用。然而,假设只想交换salary和floor成员,而不交换name成员,则需要使用不同的代码,但Swap()的参数将保持不变(两个job结构的引用),因此无法使用模板重载来提供其他的代码。

然而,可以提供一个具体化函数定义----称为显示具体化(explicit specialization),其中包含所需的代码。当编译器找到与函数调用匹配的具体化定义时,将使用该定义,而不再寻找模板。


第三代具体化(ISO/ANSI C C++标准)

  1. 对于给定的函数名,可以有非模板函数、模板函数和显式具体化模板函数以及它们的重载版本。
  2. 显式具体化的原型和定义应以template<>打头,并通过名称来指出类型。
  3. 具体化优先于常规模板,而非模板函数优先于具体化和常规模板

下面是用于交换job结构的非模板函数、模板函数和具体化的原型:

void Swap(job &, job &);

template <typename T>
void Swap(T&, T&);

template <> void Swap<job>(job&, job&);

📃如何巩固学习

提示:在学习的过程中,我们需要先自行进行思考,并且多去阅读一些大佬的书籍,俗话说的好,书籍是人类进步的阶梯!

📃本文小结

  1. C++鼓励程序员在开发程序时使用多个文件。一种有效的组织策略是,使用头文件来定义,为操纵用户类型的函数提供函数原型;并将函数定义放在一个独立的源代码文件中。头文件和源代码文件一起定义和实现了用户定义的类型及其使用方式。最后,将main()和其他使用这些函数的函数放在第三个文件中。

好啦今日的分享到这里就结束啦,我是爱你们的M malloc希望可以帮助到你们噢,最后别忘记三连啦!!

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

高效PDF校对:释放高质量内容的力量

在数字化世界中&#xff0c;内容是王者。随着企业和个人越来越依赖数字文档进行沟通、分享和创新&#xff0c;我们在PDF中传递的内容的质量变得至关重要。在这里&#xff0c;我们将探索高效的PDF校对如何帮助您释放高质量内容的真正潜力。 超越仅仅是“正确” 当我们谈论PDF校…

MBR400100CT-ASEMI肖特基模块400A 100V

编辑&#xff1a;ll MBR400100CT-ASEMI肖特基模块400A 100V 型号&#xff1a;MBR400100CT 品牌&#xff1a;ASEMI 封装&#xff1a;M2 恢复时间&#xff1a;&#xff1e;50ns 正向电流&#xff1a;400A 反向耐压&#xff1a;100V 芯片个数&#xff1a;2 引脚数量&…

Leetcode77. 组合

给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 回溯剪枝 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution {public List<List<Integer>> combine(int n, i…

展锐A13 Camera Hal dispatch模块流程 --- 上

4月份就知道展锐A13的Camera Hal有大的变动&#xff0c;但是最近一直在做一个MTK的项目&#xff0c;没去看这个新增部分的流程。最近有时间&#xff0c;就把A13上Camera Hal新增的部分流程捋 了一下&#xff0c;过程是痛苦的&#xff0c;但是坚持一遍遍去读代码&#xff0c;在结…

移动,电信,联通流量卡该怎么选?

是电信便宜&#xff0c;移动稳定&#xff0c;还是联通性价比高&#xff1f; ​ 今天&#xff0c;小编从三大流量卡的优缺点方面来讲&#xff0c;教你如何选择流量卡了。 一、移动流量卡 优点&#xff1a;信号好&#xff0c;可以说走到什么地方都有信号。 缺点&#xff1a;资…

Leaflet开发入门

Leaflet开发入门 开发环境配置Leaflet开发库开发移动端Hybrid App或移动Web App 开发环境配置 电子地图已经渗透到O2O、生活服务、出行等领域&#xff0c;传统的GIS也孕育着互联网基因。在国内互联网电子地图领域&#xff0c;百度地图和高德地图较为出色&#xff0c;天地图作为…

js的使用之时间如何定义,窗口加载事件

1.时间如何定义 1.1 date的其他的属性 带出星期几的写法 var arr [星期日,星期一,星期二,星期三,星期四,星期五,星期六,星期天] var day date.getDay(); console.log(arr[day]); 1.2 日期的格式化 1.3 时分秒的写法 固定写法&#xff1a;如果想要写成00:00:00这种形式&am…

阿里云服务器搭建FRP实现内网穿透-P2P

前言 在了解frp - p2p之前&#xff0c;请先了解阿里云服务器搭建FRP实现内网穿透-转发: 文章地址 1、什么是frp - p2p frp&#xff08;Fast Reverse Proxy&#xff09;是一个开源的反向代理工具&#xff0c;它提供了多种功能&#xff0c;包括端口映射、流量转发和内网穿透等。…

cmake 交叉编译应用程序:手动设置链接脚本

前言 在使用 cmake 交叉编译应该应用程序时&#xff0c;好像没有手动设置【链接脚本】&#xff0c;也能正常构建生成 Makefile&#xff0c;并且可以正常 Make 生成需要的 应用程序。 但是有些应用程序&#xff0c;需要手动指定【链接脚本】&#xff0c;比如修改链接地址&#…

五、多表查询-5.自连接

一、语法 二、演示-自连接&#xff08;内连接&#xff09; 【例】查询员工 及其 所属领导的名字&#xff08;managerid&#xff0c;领导也是员工表emp1表中的数据&#xff09; &#xff01;&#xff01;必须起别名&#xff01;&#xff01; ——内连接只查询交集部分的数据 …

微调真香,漫画科技博主竟然在用国产大模型生成系列漫画女主角

有一说一&#xff0c;《微调真香&#xff0c;漫画科技博主竟然在用国产大模型生成系列漫画女主角》不是标题党。 连我也不得不相信&#xff0c;作为“亲爱的数据”创始人&#xff0c;我确实在用人工智能大模型生成自家特有风格的漫画。 市面上&#xff0c;海内外&#xff0c;用…

HAproxy服务及keepalived+haproxy高可用

本节主要学习AHproxy 的概述&#xff0c;安装&#xff0c;调度算法&#xff0c;配置文件&#xff0c;负载均衡&#xff0c;配置syslog日志&#xff0c;keepalivedhaproxy实现高可用。 目录 一、概述 1、简介 2、核心功能 3、关键特性 4、应用场景 二、安装 1.内核配置 …

【附安装包】Marvelous designer12|3D服装设计

软件下载 软件&#xff1a;Marvelous designer版本&#xff1a;12语言&#xff1a;简体中文大小&#xff1a;1.49G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://p…

X(推特)推出招聘平台,马斯克进军招聘领域,欲对标 LinkedIn

8 月 26 日&#xff0c;埃隆・马斯克接手 X&#xff08;推特&#xff09;后&#xff0c;开启了一系列备受争议的变革&#xff0c;并多次在公开场合表示希望将 X 打造成为超级应用&#xff0c;受人瞩目。除了私信中推出了视频聊天和语音聊天功能之外&#xff0c;X 在今天宣布上线…

无涯教程-机器学习 - 数据加载

假设如果要启动ML项目&#xff0c;那么您需要做的第一件事也是最重要的事情是什么?这是无涯教程启动任何ML项目都需要加载的数据。关于数据&#xff0c;对于ML项目&#xff0c;最常见的数据格式是CSV(逗号分隔值)。 基本上&#xff0c;CSV是一种简单的文件格式&#xff0c;用…

网络字节序——TCP接口及其实现简单TCP服务器

网络字节序——TCP接口及其实现简单TCP服务器 文章目录 网络字节序——TCP接口及其实现简单TCP服务器简单TCP服务器的实现1. 单进程版&#xff1a;客户端串行版2. 多进程版&#xff1a;客户端并行版netstat查看网络信息3.多线程版&#xff1a;并行执行log.hpp 守护进程fg、bg s…

BI技巧丨Window应用之同环比

白茶曾介绍过OFFSET可以用来解决同环比的问题&#xff0c;其实微软最近推出的开窗函数WINDOW也可以用来解决同环比。 WINDOW函数基础语法 WINDOW ( from[, from_type], to[, to_type][, <relation>][, <orderBy>][, <blanks>][, <partitionBy>][, &l…

[论文分享]Skip-Attention: Improving Vision Transformers by Paying Less Attention

Skip-Attention: Improving Vision Transformers by Paying Less Attention 这项工作旨在提高视觉transformer&#xff08;ViT&#xff09;的效率。 虽然 ViT 在每一层都使用计算昂贵的自我注意操作&#xff0c;但我们发现这些操作在各层之间高度相关——这是导致不必要的计算的…

计算机网络-笔记-第二章-计算机网络概述

目录 二、第二章——物理层 1、物理层的基本概念 2、物理层下面的传输媒体 &#xff08;1&#xff09;光纤、同轴电缆、双绞线、电力线【导引型】 &#xff08;2&#xff09;无线电波、微波、红外线、可见光【非导引型】 &#xff08;3&#xff09;无线电【频谱的使用】 …

linux问题定位

1.CPU工作原理 2.Linux内存分配 3.栈 1&#xff09;.存储局部变量 函数参数 函数返回值的地方 2&#xff09;.每个线程的栈空间连续且相互独立 3&#xff09;.使用 x /100a $esp 可以看到栈内存中的原始数据 3.函数调用过程 函数调用过程在栈中如何组织数据的 4.堆 三级堆管理…