C++之函数模板(三)

当函数模板遇上函数重载

  • 现在考虑这样一个问题,如果写了两个相同函数体的函数,一个是模板函数,一个是普通函数,那么C++编译器会怎么进行调用呢?

  • 还是以之前的swap数据交换为例:


#include<iostream>
using namespace std;

template<typename T>
void myswap(T &a, T &b)
{
 T c;
 c = a;
 a = b;
 b = c;
 cout << "我是模板函数..\n";
}
void myswap(int a, char b)
{
 cout << "a " << a << " " << "b " << b << " " << endl;
 cout << "我是普通函数..\n";
}

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

	myswap(a, b);	//普通函数的调用

	myswap(b, a);	//调用普通函数: 可以进行隐式的类型转换

	myswap(a, a);	//函数模板调用(本质: 类型参数化)	:执行严格的类型匹配

	system("pause");

}

  • 结论:
    • 函数模板不允许自动类型转化
    • 普通函数可以自动类型转化

函数模板和普通函数在一起时,调用规则:

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

案例:

#include<iostream>
using namespace std;

//普通函数 (2参数)
int MAX(int a,int b){
	cout<<"int max(int a,int b)"<<endl;
	return a>b ? a:b;
}

//函数模板(2参数)
template<typename T>
T MAX(T a, T b){
	cout << "T MAX(T a,T b)..\n";
	return a > b ? a : b;
}

//函数模板(3参数)
template<typename T>
T MAX(T a,T b,T c){
	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; //重载3个参数的

	cout << MAX('a', 100) << endl;  //调用普通函数 隐式类型转换
	
	system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值