C++回顾(十四)—— 函数模板

news2024/11/17 0:30:37

14.1 概述

  • 所谓函数模板(function template),实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。
  • 凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。

14.2 函数模板语法

14.2.1 定义

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

14.2.2 调用

(1)隐式调用(自动类型推导)

(2)显式调用(指定类型)

在这里插入图片描述
示例代码:

#include <iostream>

using namespace std;

/*
int add(int x, int y)
{
	return x + y;
}

double add(double x, double y)
{
	return x + y;
}*/

template <typename T>    //声明虚拟类型T(作用域只局限于下面紧跟的一个函数)
T add(T x, T y)
{
	return x + y;
}

template <typename T>
void show(T x)
{
	cout << x << endl;
}

template <typename T1, typename T2>
void print(T1 x, T2 y)
{
	cout << x << y << endl;
}

int main()
{
	cout << add(1, 2) << endl;       //隐式调用(自动数据类型推导)
	cout << add(1.11, 2.22) << endl;

	cout << add<int>(1, 'a') << endl;   //显示调用(指定转换为int类型)
	cout << add<char>(1, 'a') << endl;   //显示调用(指定转换为char类型)

	print(1, 'a');
	print<double, char>(1.11, 'a');

	show(1);

	return 0;
}

运行结果:
在这里插入图片描述

14.3 函数模板遇上函数重载

14.3.1 函数模板和普通函数区别

  • 函数模板不允许自动类型转化
  • 普通函数能够进行自动类型转换

14.3.2 函数模板和普通函数在一起调用规则

  • 1 函数模板可以像普通函数一样被重载
  • 2 C++编译器优先考虑普通函数
  • 3 如果函数模板可以产生一个更好的匹配,那么选择模板
  • 4 可以通过空模板实参列表的语法限定编译器只通过模板匹配

注意:普通函数和模板函数同时存在,优先调用普通函数

示例代码:

#include <iostream>

using namespace std;

int add(int x, int y)
{
	cout << "普通函数" << endl;
	return x + y;
}

template <typename T>
T add(T x, T y)
{
	cout << "模板函数" << endl;
	return x + y;
}

template <typename T>
void show(T x, T y)
{
	cout << x << y << endl;
}

int main()
{
	cout << add(1, 'a') << endl;   //普通函数可以进行默认类型转换
	show<int>(1, 'a');             //模板函数没有默认的类型转换

	add(1, 2);                     //普通函数和模板函数同时存在,优先调用普通函数


	return 0;
}

运行结果:
在这里插入图片描述

14.4 函数模板机制

  • 编译器并不是把函数模板处理成能够处理任意类的函数
  • 编译器从函数模板通过具体类型产生不同的函数
  • 编译器会对函数模板进行两次编译
  • 在声明的地方对模板代码本身进行编译;在调用的地方对参数替换后的代码进行编译。

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

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

相关文章

数据分析方法08用户画像

用户画像 1、 概念 用户画像是指用户信息标签化&#xff0c;通过收集用户多维度的信息数据&#xff08;如人口统计属性&#xff0c;社会属性&#xff0c;行为偏好&#xff0c;消费习惯等&#xff09;&#xff0c;对其进行统计&#xff0c;分析&#xff0c;从而抽象出用户信息…

Ubuntu c++ MySQL数据库操作

mysql安装sudo apt-get install updatesudo apt-get install mysql-server libmysqlclient-dev mysql-workbenchmysql启动/重启/停止sudo service mysql start/restart/stop登录mysql命令&#xff1a;mysql -uroot -p错误异常&#xff1a;解决办法&#xff1a;修改mysqld.cnf配…

软件测试员如何进行产品测试?

一般来讲&#xff0c;当软件成为一个成功的产品后&#xff0c;产品测试工作就会复杂很多。比如拥有的用户量大&#xff0c;迭代频繁&#xff0c;测试的周期短&#xff0c;重复性强。面对紧张复杂的产品测试工作&#xff0c;软件测试员应怎样完成这一系列的测试工作呢&#xff1…

如何修复dxgi.dll文件错误?修复方法推荐

如果您使用Windows操作系统&#xff0c;在使用某些应用程序时&#xff0c;可能会遇到dxgi.dll文件错误。这可能会导致应用程序崩溃或无法正常运行。在本文中&#xff0c;我们将探讨如何修复dxgi.dll文件错误。 一.什么是dxgi.dll文件 dxgi.dll文件是Microsoft DirectX图形接口…

域控制器搭建以及成员加入

需要iso&#xff1a;windows server 2016软件使用&#xff1a;vmwarewindows server 2016系统搭建自己选iso&#xff0c;一直下一步就可以安装完成。&#xff08;记得要设置密码&#xff09;&#xff08;密码要求大小写字母数字符号&#xff09;等待就能安装完成。安装和配置Ac…

day28_js

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 零、 复习昨日 CSS 美化,复用,样式文件和表现文件分离便于维护 选择器 {属性:值;…} 引入css 内联文件内部使用style标签外部文件 <link href"路…

sqoop安装 使用

目录 拷贝安装包 解压 改名 拷贝jar包 修改配置文件 配置环境变量 查看安装情况 查看指定mysql服务器中数据库 查看指定mysql服务器数据库中的表 在hive中创建一个teacher表跟mysql的students中的teacher结构相同 将mysql中students库中的sc数据导出到hdfs指定的文件目…

Spring Cache 介绍及使用方法

目录 一、Spring Cache介绍 1、Spring Cache常用注解 二、Spring Cache使用redis缓存步骤 1、添加依赖 2、添加配置 3、使用注解 一、Spring Cache介绍 Spring cache是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实…

阿里云EMR集群搭建及使用

目录 1.简介 1.什么是EMR 2.组成 3.与自建hadoop集群对比 4.产品架构 2.使用 1.创建EMR集群 1.登录EMR on ECS控制台 2.软件设置 3.硬件设置 3.基础配置 2.配置 1.组件配置 2.用户管理 3.安全组 4.Gateway 3.组件UI 1.简介 1.什么是EMR EMR是运行在阿里云平台…

国际安全领域顶会NDSS 2023录稿整理 (上)

隐私计算研习社 NDSS是网络和系统安全领域的四大顶级国际学术会议&#xff08;BIG4&#xff09;之一&#xff0c;第三十届会议于2023年2月27日到3月3日&#xff0c;在美国圣迭戈举办。本文将分上下两部分整理会议录取的94篇论文&#xff0c;并对论文进行分类&#xff0c;感兴趣…

【数据库概论】第七章 数据库设计

第七章 数据库设计 7.1 概述 1.数据库设计的基本步骤 数据库设计可以分为以下六个阶段 需求分析阶段 准别了解和分析用户的需求&#xff08;包括数据与处理&#xff09;。需求分析是整个设计过程的基础&#xff0c;觉定了在其上构建数据库的速度和质量。需求分析做不好可能会…

TwinCAT 3 ADS Monitor使用

TwinCAT 3 ADS Monitor使用 《20211022 TwinCAT ADS Monitor的使用方法》 《TwinCAT3.1从入门到精通》 TF6010 | TwinCAT 3 ADS Monitor 以上是基础知识&#xff0c;下面是实操 先在Instance中查看变量的偏移量&#xff0c;即地址 多变量读写测试 结果如下&#xff0c;4条指令…

GPC爬虫池有什么用?

GPC爬虫池有什么用&#xff1f; 答案是&#xff1a;100%提高外贸网站在Google搜索引擎的收录量。 众所周知&#xff0c;要想免费从谷歌搜索引擎获取流量&#xff0c;就好做好谷歌SEO。 一个网站是否能获取谷歌的认可&#xff0c;有一个重要的技术指标&#xff0c;就是这个网…

R语言基础(一):注释、变量

R语言用于统计分析和绘制图表等操作。不同于Java等其它语言&#xff0c;R用于统计&#xff0c;而不是做一个网站或者软件&#xff0c;所以R的一些开发习惯和其它语言不同。如果你是一个编程小白&#xff0c;那么可以放心大胆的学。如果你是一个有编程基础的人&#xff0c;那么需…

数字化时代,你应该知道的BI

我曾经看到有人在讨论过商业智能BI的部署对于企业是否有实际意义&#xff0c;现在市场的数据已经证明商业智能BI在商业世界中&#xff0c;在企业的实践中证明了自己的价值&#xff0c;得到了广泛的认可。 一、什么是BI 有一点可能很多人没有想到&#xff0c;实际上商业智能BI…

CorelDRAW2023详解新增七大功能 ,CorelDRAW2023最新版本更新怎么样?

CorelDRAW2023新功能有哪些&#xff1f;CorelDRAW2023最新版本更新怎么样&#xff1f;让我们带您详细了解&#xff01; CorelDRAW Graphics Suite 2023是矢量制图行业的标杆软件&#xff0c;2023年全新版本为您带来多项新功能和优化改进。本次更新强调易用性&#xff0c;包括更…

如何使用vue创建一个完整的前端项目

搭建Vue项目的完整流程可以分为以下几个步骤&#xff1a;安装Node.js和npm&#xff1a;Vue.js是基于Node.js开发的&#xff0c;因此在开始搭建Vue项目之前&#xff0c;需要先安装Node.js和npm&#xff08;Node.js的包管理器&#xff09;。可以从官网下载Node.js安装包并安装。安…

数据的存储--->【大小端字节序】(Big Endian)(Little Endian)

⛩️博主主页&#xff1a;威化小餅干&#x1f4dd;系列专栏&#xff1a;【C语言】藏宝图&#x1f38f; ✨绳锯⽊断&#xff0c;⽔滴⽯穿&#xff01;一个编程爱好者的学习记录!✨前言计算机硬件有两种存储数据的方式&#xff1a;大端字节序——Big Endian小端字节序——Little …

【Android -- 开源库】表格 SmartTable 的基本使用

介绍 1. 功能 快速配置自动生成表格&#xff1b;自动计算表格宽高&#xff1b;表格列标题组合&#xff1b;表格固定左序列、顶部序列、第一行、列标题、统计行&#xff1b;自动统计&#xff0c;排序&#xff08;自定义统计规则&#xff09;&#xff1b;表格图文、序列号、列标…

第十四届蓝桥杯三月真题刷题训练——第 6 天

目录 第 1 题&#xff1a;星期计算 问题描述 运行限制 代码&#xff1a; 第 2 题&#xff1a;考勤刷卡 问题描述 输入格式 输出格式 样例输入 样例输出 评测用例规模与约定 运行限制 代码&#xff1a; 第 3 题&#xff1a;卡片 问题描述 输入格式 输出格式 样…