普通函数与模板函数的调用规则

2023-11-14

普通函数与模板函数的调用规则

1.如果函数模板和普通函数都可以实现,优先调用普通函数
2.可以通过空模板参数列表来强制调用函数模板
3.函数模板也可以发生重载
4.如果函数模板可以产生更好的匹配,优先调用函数模板

代码示例

1.如果函数模板和普通函数都可以实现,优先调用普通函数

#include <iostream>
using namespace std;
#include <string>

//普通函数
void myFunc(int a, int b)
{
	cout <<"调用的是普通函数" <<endl;
	cout << "a+b = " << a+b << endl;
}

//函数模板
template<class T>
void myFunc(T a,T b)
{
	cout <<"调用的是函数模板" <<endl;
	cout << "a+b = " << a+b <<endl;
}

void test1()
{
	int a = 10;
	int b = 20;
	myFunc(a,b);        
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述
2.可以通过空模板参数列表来强制调用函数模板

#include <iostream>
using namespace std;
#include <string>

//普通函数
void myFunc(int a, int b)
{
	cout <<"调用的是普通函数" <<endl;
	cout << "a+b = " << a+b << endl;
}

//函数模板
template<class T>
void myFunc(T a,T b)
{
	cout <<"调用的是函数模板" <<endl;
	cout << "a+b = " << a+b <<endl;
}

void test1()
{
	int a = 10;
	int b = 20;
	myFunc<>(a,b);         //空模板参数列表
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述
3.如果函数模板可以产生更好的匹配,优先调用函数模板

#include <iostream>
using namespace std;
#include <string>

//普通函数
void myFunc(int a, int b)
{
	cout <<"调用的是普通函数" <<endl;
	cout << "a+b = " << a+b << endl;
}

//函数模板
template<class T>
void myFunc(T a,T b)
{
	cout <<"调用的是函数模板" <<endl;
	cout << "a+b = " << a+b <<endl;
}

void test1()
{
	char a = 'a';
	char b = 'b';
	myFunc(a,b);         
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述
这里是因为普通函数需要做隐式转换(char —》int),函数模板不用转换,所以编译器会选择不用转换的那条路,更方便。
4.函数模板也可以发生重载

#include <iostream>
using namespace std;
#include <string>

//函数模板
template<class T>
void myFunc(T a,T b)
{
	cout <<"调用的是a+b" <<endl;
	cout << "a+b = " << a+b <<endl;
}

//函数模板
template<class T>
void myFunc(T a,T b,T c)
{
	cout <<"调用的是a+b+c" <<endl;
	cout << "a+b+c= " << a+b+c <<endl;
}

void test1()
{
	char a = 'a';
	char b = 'b';
	char c=  'c';
	myFunc(a,b);       
	myFunc(a,b,c);    
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

普通函数与模板函数的调用规则 的相关文章

随机推荐

  • 人工智能:分类算法——朴素贝叶斯、决策树的简单理解与代码实现,SVM、人工神经网络的简单理解

    下文使用代码 链接 pan baidu com s 1sR2bt Iu89M3h 8XMPjEuQ 提取ey3q 分类算法朴素贝叶斯 决策树 SVM 人工神经网络 汽车分类实战 一 实验目的 二 实验的硬件 软件平台 三 实验算法原理 一
  • Linux查看应用的CPU、内存使用情况

    目录 一 jps命令 二 ps命令 三 top命令 四 free命令 五 df命令 查看应用的CPU 内存使用情况 使用jps ps top free df命令查看 一 jps命令 可以列出本机所有java应用程序的进程pid jps op
  • c++11 chrono全面解析(高精度时钟,可达纳秒级别)

    1 精度 时钟节拍 时间精度 template
  • 进程池

    进程池 进程池的使用场景 当我们需要并行的处理大规模任务的时候 需要使用到多进程 多线程技术 比如说服务器处理大量客户端的任务 我在大一的时候写过一个C S mysql架构的聊天室 大概是这样处理的 每当有客户端发出连接请求时 服务器acc
  • 如何获取美团的热门商品和服务

    导语 美团是中国最大的生活服务平台之一 提供了各种各样的商品和服务 如美食 酒店 旅游 电影 娱乐等 如果你想了解美团的热门商品和服务 你可以使用爬虫技术来获取它们 本文将介绍如何使用Python和BeautifulSoup库来编写一个简单
  • 【React】Hooks入门教程(二、React最常用的四种钩子)

    这个 API 是 React 的未来 有必要深入理解 本文谈谈我的理解 简单介绍它的用法 帮助大家快速上手 阅读本文需要有 React 基础 如果你还没学会 React 可以先看一下它的教程 更新 我后来又写了一篇 轻松学会 React 钩
  • 计算机网络——7层OSI网络模型

    文章目录 OSI模型 1 应用层 2 表示层 3 会话层 4 传输层 5 网络层 6 网络链路层 7 物理层 TCP IP分层模型 1 第一层 网络接口层 和物理层 2 第二层 网间 络 层 3 第三层 传输层 4 第四层 应用层 TCP
  • xxj-job容器部署

    一 admin端命令 docker run e PARAMS spring datasource url jdbc mysql 127 0 0 1 3306 xxl job useUnicode true characterEncoding
  • ReentrantLock学习总结

    ReentrantLock锁和synchronized锁相比具有以下特点 可被中断 即可以设置 可中断锁 当t1线程获取不到锁对象处于Blocked状态时 可由另一个线程调用t1的interrupt方法将其中断 此时t1会抛出被打断异常 可
  • 使用dat.gui更改three.js中的物体变量

    一 dat gui介绍 gui是一种JavaScript库 用于创建可视化控件和调试工具 它是dat gui的简称 dat gui是一个用于在Web应用程序中创建可定制GUI的JavaScript库 它可以轻松创建滑块 复选框 颜色选择器等
  • 正点原子IMXU开发板Qt开发环境搭建及测试

    Qt交叉编译器的安装 第一步 安装Qt开发使用的交叉编译器 位于 开发光盘A 基础资料 5 开发工具 交叉编译器 第二步 使用FileZilla Client将交叉编译器传输到Ubuntu中 第三步 在Ubuntu中给传输过去的交叉编译器可
  • mysql判断时间是否在当前时间内_判断当前时间是否在某时间段内

    public static booleantimeQuantum String stTime String edTime Calendar cal Calendar getInstance 获得一个日历 SimpleDateFormat s
  • [学习笔记]Linux + Nginx环境下部署 Web 站点

    部署后端程序 请阅读 学习笔记 Linux环境下部署 Net5 程序 林晓lx的博客 打包项目 以Vue项目为例 首先打包站点 前往项目的根目录并键入 yarn build 等待打包结束 成功后将在根目录下生成dist文件夹 用Zip压缩d
  • 信息学奥赛一本通C++语言——1139:整理药名

    题目描述 医生在书写药品名的时候经常不注意大小写 格式比较混乱 现要求你写一个程序将医生书写混乱的药品名整理成统一规范的格式 即药品名的第一个字符如果是字母要大写 其他字母小写 如将ASPIRIN aspirin整理成Aspirin 输入
  • 子网掩码详解

    一 子网掩码的概念及作用 子网掩码 subnet mask 又叫网络掩码 地址掩码 子网络遮罩 是一个应用于 TCP IP 网络的 32 位二进制值 它可以屏蔽掉 IP 地址中的一部分 从而分离出 IP 地址中的网络部分与主机部分 基于子网
  • css相对单位和绝对单位

    css长度单位分为 相对长度 和 绝对长度 1 相对长度 相对长度单位指定了一个长度相对于另一个长度的属性 对于不同的设配相对长度更加适用 单位 描述 em 它是描述相对于应用在当前元素的字体尺寸 所以它是相对长度单位 一般浏览器字体大小默
  • Ubuntu20.04 LTS 安装 ros Noetic 树莓派4/PC

    Ubuntu 20 04 LTS 安装树莓派系统 主要参考了这两篇文章 https blog csdn net liangforcold article details 126385774 https blog csdn net yangc
  • VS2010点滴——不能将参数 1 从“const char [11]”转换为“LPCWSTR”

    include windows h include iostream using namespace std int main char Write 10 Read 10 for int i 0 i lt 10 i Write i 10 i
  • Ubuntu 安装指定版本 Mysql,并设置远程连接(以安装mysql 5.5 为例)

    目录 一 安装Mysql 1 卸载Mysql 可跳过 2 安装mysql 软件源 3 安装mysql 5 5 4 验证测试 二 设置远程登录 1 允许使用root账号远程连接 2 Mysql 允许远程登录 一 安装Mysql 1 卸载Mys
  • 普通函数与模板函数的调用规则

    普通函数与模板函数的调用规则 1 如果函数模板和普通函数都可以实现 优先调用普通函数 2 可以通过空模板参数列表来强制调用函数模板 3 函数模板也可以发生重载 4 如果函数模板可以产生更好的匹配 优先调用函数模板 代码示例 1 如果函数模板