当函数模版遇上函数重载

Posted llguanli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当函数模版遇上函数重载相关的知识,希望对你有一定的参考价值。

demo 1

#include <iostream>
using namespace std;

//让 类型參数化 ===, 方便程序猿进行编码
// 泛型编程 
//template 告诉C++编译器 我要開始泛型编程了 .看到T, 不要随便报错
template <typename T>
void myswap(T &a, T &b)
{
	T c = 0;
	c = a;
	a = b;
	b = c;
	cout << "hello ....我是模板函数 欢迎 calll 我" << endl;
}

void myswap(int a, char c)
{
	cout << "a:" << a << "c:" << c << endl;
	cout << "我是普通函数 欢迎来訪" << endl;
}


void main()
{
	int		a = 10;
	char	c = 'z';

	myswap(a, c); // 普通函数的调用:  能够进行隐式的类型转换 
	myswap(c, a); // 调用函数模版

	myswap(a, a); // 函数模板函数的调用(本质:类型參数化): 将严格的依照类型进行匹配,不会进行自己主动类型转换

	
	cout<<"hello..."<<endl;
	system("pause");
	return ;
}
通过demo 1能够得到:

函数模板和普通函数差别结论:

1、函数模板不同意自己主动类型转化;

2、普通函数可以进行自己主动类型转换。


demo 2

/*
函数模板不同意自己主动类型转化
普通函数能够进行自己主动类型转换
*/


#include "iostream"
using namespace std;


int Max(int a, int b)
{
	cout<<"int Max(int a, int b)"<<endl;
	return a > b ?

a : b; } template<typename T> T Max(T a, T b) { cout<<"T Max(T a, T b)"<<endl; return a > b ? a : b; } template<typename T> T Max(T a, T b, T c) { cout<<"T Max(T a, T b, T c)"<<endl; return Max(Max(a, b), c); } void main() { int a = 1; int b = 2; cout<<Max(a, b)<<endl; //当函数模板和普通函数都符合调用时,优先选择普通函数 cout<<Max<>(a, b)<<endl; //若显示使用函数模板,则使用<> 类型列表 cout<<Max(3.0, 4.0)<<endl; //假设 函数模板产生更好的匹配 使用函数模板 cout<<Max(5.0, 6.0, 7.0)<<endl; //重载 cout<<Max('a', 100)<<endl; //调用普通函数 能够隐式类型转换 system("pause"); return ; }

通过demo 2的分析能够得到:

函数模版和普通函数在一起的调用规则:

1、函数模版能够像普通函数一样被重载。

2、C++编译器优先考虑普通函数;

3、假设函数模版能够产生一个更好的匹配。那么选择模版;

4、能够通过空模版实參列表的语法限定编译器仅仅通过模版匹配。

记住这4点。就能避免非常多错误了



0
0
查看评论
* 以上用户言论仅仅代表其个人观点,不代表CSDN站点的观点或立场

C++ 模板函数和非模板函数的重载

关于函数的重载机制。是一个比較复杂的问题,当中涉及到了优先级定义和最佳匹配等问题,假设要阐述清楚,恐怕不是一两篇文章就能说的明确。

可是假设掌握了一些经常使用的“规律”。对于了解程序对重载函数是怎样进行选择...

  • 技术分享图片
  • colddie
  • 2013-03-12 16:29
  • 2396

从零開始学C++之模板(一):函数模板、函数模板特化、重载函数模板、非模板函数重载

一、引子 考虑求两数较大值函数max(a,b) 对于a,b的不同类型,都有同样的处理形式: return a 用已有方法解决: (1)宏替换 #define max(a,b) ((a) 存...
  • 技术分享图片
  • Simba888888
  • 2013-07-20 20:09
  • 3495

C++ 虚函数和函数重载

函数重载 怎样讲函数重载: What——函数重载是什么? why——为什么要用函数重载,没有函数重载会如何? how——举例说明怎么使用函数重载 *****************...
  • 技术分享图片
  • jscese
  • 2014-07-23 19:34
  • 1220

关于模版重载函数函数命名冲突的解决方式

函数模版重载命名冲突的解决方式 我们编写函数模版的时候肯定或多或少会遇到这些问题错误 error C2668: “min”: 对重载函数的调用不明白 ,细致找了半天怎么也找不出错误。换了非常...
  • 技术分享图片
  • xiaoyyu_ai_c
  • 2017-11-28 14:42
  • 27

C++函数重载

  • 2013-09-19 20:17
  • 3KB
  • 下载
技术分享图片

函数重载和立方值

  • 2014-09-12 11:00
  • 3KB
  • 下载
技术分享图片

phpCMS模版解析之TEMPLATE函数

昨天跟到了phpcms系统初始化到控制器流程 今天阿唐屌丝带大家一起分析phpcms模版机制 控制器 在进行一些 逻辑操作后 就開始渲染 视图显示 用到 template函数 所以要搞清phpcm...
  • 技术分享图片
  • jsbba
  • 2014-05-02 00:26
  • 2477

函数重载和覆盖的差别.doc

  • 2012-04-12 21:39
  • 27KB
  • 下载
技术分享图片

重载、覆盖、多态与函数隐藏

  • 2014-01-24 10:25
  • 60KB
  • 下载
技术分享图片

template学习之零值初始化及字符串常量作(function template argument)函数模版參数问题

本篇仅仅是摘抄自《c++ template》小问题比較少注意,并且也easy忘记 1 零值初始化 对于主要的数据类型int,double,pointer type来说,一般没有default构造式对其初始化...
  • 技术分享图片
  • qingtianweichong
  • 2013-07-26 20:59
  • 784
    个人资料
    • 訪问:389772次
    • 积分:7872
    • 等级: 技术分享图片
    • 排名:第3041名
    • 原创:400篇
    • 转载:30篇
    • 译文:11篇
    • 评论:87条
    博客专栏






以上是关于当函数模版遇上函数重载的主要内容,如果未能解决你的问题,请参考以下文章

函数模板遇上函数重载

函数 的 重载 和 函数 模版

代码坏味道之过长的參数列

C++中函数模板和模板函数的区别

当两个重载具有相同的签名时调用构造函数重载

当结构体遇上宏定义,以及函数指针的高级写法(结构体中能用宏定义一个函数?)