【直击招聘C++】5.1函数模板
5.1函数模板
- 一、要点归纳
- 1.定义函数模板
- 2.实例化函数模板
- 3.重载模板函数
- 4.函数调用的匹配顺序
一、要点归纳
1.定义函数模板
定义函数模板的一般格式如下:
template<类型形参表>
返回类型 函数名(形参表)
{函数体;
}
例如以下代码定义了一个绝对值的函数模板
template <class T>
T abs(T x)
{if(x<0) return -x;return x;
}
2.实例化函数模板
函数模板式不能直接执行的,需要在实例化为模板函数后才能执行。例如abs(-10)用于实例化前面声明的函数模板,-10为int型,所以实例化为以下真正的模板函数:
int abs(int x)
{if(x<0)return -x;return x;
}
有关实例化函数模板的说明如下:
- 和普通函数一样,如果函数模板定义放在实例化之后,需要对其声明。例如前面的abs函数模板的声明方式如下:
template <class T>
T abs(T x);
- 虽然模板参数T可以实例化为各种类型,但是采用模板参数T的各参数之间必须保持完全一致。例如下面程序中存在错误:
template <class T>
T min(T x, T y)
{return (x > y) ? y : x;
}
void test01()
{int n = 3;char c = 'a';double d = 2.4;std::cout << min(n, n) << std::endl; // 正确std::cout << min(c, c) << std::endl; // 正确std::cout << min(d, d) << std::endl; // 正确// std::cout << min(n, c) << std::endl; // 错误// std::cout << min(d, c) << std::endl; // 错误// std::cout << min(n, d) << std::endl; // 错误
}
- 在函数模板实例化时,template中定义的每个类型参数都应该得到明确的类型值,例如以下函数模板定义没有错误:
template <class T,class T>
T1 abs(T x)
{if(x<0) return -x;return x;
}
但执行abs(-10)时候会出现不能确定模板参数T1的错误。
- 在函数模板实例化中显式给出类型参数的数据类型时,可以部分给出类型参数的数据类型。在李世华过程中按template中指定的顺序进行类型参数的匹配。例如有以下函数模板:
template <class T1,class T2>
T1 max(T1 x,T2 y)
{if (x>y) return x;else return y;
}
以下的函数模板实例化都是正确的:
max<int,char>(1,'a) //T1为int,T2为char,返回'a'的ascii码97
max<int>(1,2.5) //T1为int,T2为double,返回2.5的int型2
- 当类型形参表中含有用户定义的类类型时,需要在类中设计相关重载运算符。例如如下程序式正确的:
template <class T>
T max(T x, T y)
{return (x > y) ? x : y;
}class A
{int n;public:A(int x) : n(x) {}bool operator>(A s) // 重载运算符{if (n > s.n)return true;elsereturn false;}void display() { std::cout << n << std::endl; }
};
void test02()
{A a(1), b(2);max(a, b).display();
}
如果类中没有定义重载运算符“>”,则在模板函数max中会报错。
3.重载模板函数
重载模板函数如下:
template <class T>
void dispArr(T *arr, int n)//函数模板1
{int i;for (i = 0; i < n; i++)std::cout << arr[i] << " ";std::cout << std::endl;
}
template <class T>
void dispArr(T *arr, int i, int j)//函数模板2
{int k;for (k = i; k < j; k++)std::cout << arr[k] << " ";std::cout << std::endl;
}
void test03()
{int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};double b[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};std::cout << "a:";dispArr(a, 8);std::cout << "b:";dispArr(b, 2, 6);
}
4.函数调用的匹配顺序
- 调用函数时,首先寻找参数完全匹配的非模板函数,如果找到了,就调用。
- 在1寻找失败后,寻找一个函数模板,将其实例化,产生一个匹配的模板函数,若找到了就调用。
- 在1和2均失败后寻找非模板重载函数;
- 如果均失败,则报错;
相关文章:
【直击招聘C++】5.1函数模板
5.1函数模板一、要点归纳1.定义函数模板2.实例化函数模板3.重载模板函数4.函数调用的匹配顺序一、要点归纳 1.定义函数模板 定义函数模板的一般格式如下: template<类型形参表> 返回类型 函数名(形参表) {函数体; }例如以…...
谈谈Java多线程离不开的AQS
如果你想深入研究Java并发的话,那么AQS一定是绕不开的一块知识点,Java并发包很多的同步工具类底层都是基于AQS来实现的,比如我们工作中经常用的Lock工具ReentrantLock、栅栏CountDownLatch、信号量Semaphore等,而且关于AQS的知识点…...
国际化语言,多语言三种方式
可以用透传的方式,自己写local的json文件,不需要配置什么,直接传,自己写方法i18n nextjsi18n umi4一、透传的方式 export const AppContext React.createContext<any>({})app.tsx 用context包裹import type { AppProps } f…...
C++——哈希3|位图
目录 常见哈希函数 位图 位图扩展题 位图的应用 常见哈希函数 1. 直接定址法--(常用) 这种方法不存在哈希冲突 取关键字的某个线性函数为散列地址:Hash(Key) A*Key B 优点:简单、均匀 缺点:需要事先知道关键字的…...
75 error
全部 答对 答错 选择题 3. 某公司非常倚重预测型方法交付项目,而其招聘的新项目经理却习惯于运用混合型方法。项目范围包含很多不清晰的需求。项目经理应该如何规划项目的交付? A company that is heavily focused on delivering projects using predi…...
ESP-C3入门8. 连接WiFi并打印信息
ESP-C3入门8. 连接WiFi并打印信息一、ESP32 连接WiFi的基本操作流程1. 初始化nvs存储2. 配置WiFi工作模式3. 设置WiFi登陆信息4. 启动WiFi5. 开启连接6. 判断是否成功二、事件处理函数1. 定义事件处理函数2. 创建事件组3. 在事件处理函数中设置事件组位4. 在其他任务中等待事件…...
使用python将EXCEL表格中数据转存到数据库
使用Python将excel表格中数据转存到数据库 1. 思路: 1) 使用python读取excel表格中数据 2)根据数据生成sql语句 3)批量运行sql语句 2. 代码: import pandas as pddef readExcel(path, excel_file):return pd.read_e…...
【C++】类和对象(三)
目录 一、构造函数补充 1、初始化列表 1.1、初始化列表概念 1.2、初始化列表性质 2、explicit关键字 二、static成员 1、概念及使用 2、性质总结 三、友元 1、友元函数 2、友元类 四、内部类 五、拷贝对象时的一些编译器优化 一、构造函数补充 在《类和对象&#x…...
vTESTstudio - VT System CAPL Functions - General/Trigger Function
前面文章中我们已经介绍了常用的几种板卡的基本信息,那这些板卡该如何去通过软件调用呢?带着这个问题我们开始新的一块内容 - VT系统相关的自动化控制函数介绍,我会按照不同的板卡来分类,对其可控制的函数进行介绍,方便…...
IDEA 快捷键
ctrlD :复制当前行到下一行 ctrlO : 重写当前类的方法 ctrlshiftu : 大小写转化 Alt 上/下 :跳到上一个、下一个函数 Alt 左/右 : 回到上一个、下一个文件 Alt 回车 : 代码修正 Alt Insert : 插入代码 Ctrl Alt L …...
2023新华为OD机试题 - 入栈出栈(JavaScript) | 刷完必过
入栈出栈 题目 向一个空栈中依次存入正整数 假设入栈元素N(1 <= N <= 2^31-1) 按顺序依次为Nx ... N4、N3、N2、N1, 当元素入栈时,如果N1=N2+...Ny (y的范围[2,x],1 <= x <= 1000) 则N1到Ny全部元素出栈,重新入栈新元素M(M=2*N1) 如依次向栈存储6、1、2、3,当存…...
微信公众号扫码授权登录思路
引言 上学期研究了一下微信登录相关内容,也写了两三篇笔记,但是最后实际登录流程没有写,主要因为感觉功能完成有所欠缺,一直也没有好的思路;这两天我又看了看官方文档,重新构思了一下微信公众号登录相关的…...
数据结构与算法基础-学习-10-线性表之顺序栈的清理、销毁、压栈、弹栈
一、函数实现顺序栈的其他函数实现,请看之前的博客链接《数据结构与算法基础-学习-09-线性表之栈的理解、初始化顺序栈、判断顺序栈空、获取顺序栈长度的实现》。1、ClearSqStack(1)用途清理栈的空间。只需要栈顶指针和栈底指针相等ÿ…...
Hazel游戏引擎(005)
本人菜鸟,文中若有代码、术语等错误,欢迎指正 我写的项目地址:https://github.com/liujianjie/GameEngineLightWeight(中文的注释适合中国人的你) 文章目录前言关键操作代码文件关键代码代码流程代码文件关键代码exter…...
牛客网Python篇数据分析习题(四)
1.现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔): Nowcoder_ID:用户ID Level:等级 Achievement_value:成就值 Num_of_exercise&a…...
盲盒如何创业?
所谓的“盲盒”,受众群体大部分是那些爱碰运气的人,顾客买的是那种在打开盲盒时一刹那的惊喜感和神秘感,在打开盲盒之前,谁也不知道自己会得到什么,这也是为什么消费者更愿意购买的原因。网上的盲盒,主要是…...
第1集丨Java中面向对象相关概念汇总
目录一、基本概念1.1 类1.2 属性1.3 方法1.4 静态1.5 包1.6 import二、高级概念2.1 构造方法2.2 继承2.3 super & this2.4 多态2.5 方法重载2.6 方法重写2.7 访问权限2.8 内部类2.9 final2.10 抽象2.11 接口2.12 匿名类面向对象的编程思想力图使计算机语言中对事物的描述与…...
高性能(二)
三、读写分离和分库分表 1.读写分离 1.1 概述 将数据库的读写操作分散到不同的数据库节点上 通常一主多从一台主数据库负责写,多台从数据库负责读。 主库和从库之间会进行数据同步,以保证从库中数据的准确性。 1.2 问题及解决 1.2.1 问题 主从同…...
Allegro如何实现同一个屏幕界面分屏显示操作指导
Allegro如何实现同一个屏幕界面分屏显示操作指导 在做PCB设计的时候,会需要分屏显示,比如一边是放大的视图,另外一边是缩小的视图,Allegro支持同一个屏幕界面下进行分屏显示,如下图 而且会实时同步起来 如何分屏,具体操作如下 点击View...
前后端一些下载与配置(第二篇 第10天过后)nuxt banner redis 短信服务
NUXT 应该是不用怎么装? 有现成的 axios 还需要在npm吗 好像已经有现成的了 banner banner 笔记汇总P396 Redis Linux安装redis tar -xzvf redis-6.2.6.tar.gz cd redis-6.2.6 照着他做 然后 cd /usr/local/redis/bin ./redis-server /usr/local/redis…...
OSG三维渲染引擎编程学习之四十八:“第五章:OSG场景渲染” 之 “5.6 多重纹理映射”
目录 第五章 OSG场景渲染 5.6 多重纹理映射 5.6.1 多重纹理映射介绍 5.6.2 多重纹理映射示例...
对Node.js 的理解?优缺点?应用场景?
一、是什么 Node.js 是一个开源与跨平台的 JavaScript 运行时环境 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核),利用事件驱动、非阻塞和异步输入输出模型等技术提高性能 可以理解为 Node.js 就是一个服务器端的、非阻塞式I/…...
Bean的生命周期
所谓的生命周期指的是一个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做一个对象的生命周期~~ Bean的生命周期分为以下五大部分: 实例化(为 Bean 分配内存空间) 设置属性(Bean对象注入/装配) 初…...
Python学习-----函数2.0(函数对象,名称空间,作用域-->全局变量与局部变量)
目录 前言: 1.函数对象 (1)函数对象的引用 (2)函数可以放到序列里面 (3)函数可以作为参数 , 传递给另一个函数 2.名称空间 3.作用域 (1)作用域的理解 …...
Java中Json字符串和Java对象的互转
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。诞生于 2002 年。易于人阅读和编写。同时也易于机器解析和生成。JSON 是目前主流的前后端数据传输方式。 JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的…...
代码随想录NO42 | 动态规划_Leetcode70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数
动态规划_Leetcode70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数70. 爬楼梯 (进阶) 在原题基础上,改为:一步一个台阶,两个台阶,三个台阶,…,直到 m个台阶…...
【C++从入门到放弃】初识C++(基础知识入门详解)
🧑💻作者: 情话0.0 📝专栏:《C从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! C基础…...
企业工程项目管理系统源码+spring cloud 系统管理+java 系统设置+二次开发
工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…...
【GPLT 三阶题目集】L3-016 二叉搜索树的结构
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分…...
核心交换机安全多业务高性能万兆交换机
RG-S5750-24SFP/12GT交换机是锐捷网络推出的融合了高性能、高安全、多业务的新一代三层交换机。RG-S5750-24SFP/12GT 交换机能够提供灵活的介质接口,满足网络建设中不同介质的连接需要。全千兆的端口形态,加上可扩展的高密度万兆端口,提供1&a…...
wordpress robots写法/网络舆情报告
本篇介绍一些关于C语言的时间计算的函数如时间戳、当前时间、当前本地时间、时区时间、时间差以及时间的字符串字符串格式化等。 /* * Author:W; * 时间函数 *///引入头文件:头文件包含了程序中必需的或有用的信息【单行注释】 #include <iostream&g…...
彩票网站做维护是什么/杭州网站优化服务
一、简单回顾 通过前几讲的讲解,我们对工业4.0的认识趋于清晰。 第一讲告诉我们,德国实施工业4.0战略的根本目的是“确保德国制造业的未来”,联想到中国制造2025的“实现制造业由大变强的历史跨越”的战略目标,实质也是“确保中国…...
以就业为导向的高职计算机专业网站设计/seo怎么做优化工作
本文转载至http://www.cnblogs.com/mantgh/p/4276440.html 分享功能目前几乎已成为很多app的标配了,其中微信,微博等app的图片分享界面设计的很棒,不仅能够展示缩略图,还可以预览删除。最近我在做一款社交分享app,其中…...
公司网站建设哪里实惠/今天nba新闻最新消息
版本服务器是用SVN server(这个东西是放到版本机服务器上的) 版本管理工具是用小乌龟(tortoiseSVN,这个是在各个机器上使用) 1,昨天下载了SVN server 按照网上教程搭建好 https://www.cnblogs.com/jutop…...
网站建设与管理量化考细则/2345浏览器网址
LoadRunner压力测试时,一直会报12261错误,错误内容大概如下: Error -26612: HTTP Status-Code500 (Internal Server Error) for。。。。。。。。 网上也没有好的解决方案,有些人说看日志,但是具体解决方案没有…...
揭阳企业网站建设开发/企业营销策划方案范文
1.Homestead 安装lumen / laravel 过程记录 //2019.1.9 周三 春风路3007号 2. 3. 4. 5. 后续补充......