函数模板遇上函数重载

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

规则

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

实例


#include<iostream>

using namespace std;

template<typename T>
void fun(T& a, T& b) {
	cout << "a" << a << "-b: " << b << endl;
	cout << "我是模板函数" << endl;
}

void fun(int a, char b) {
	cout << "a" << a << "-b: " << b << endl;
	cout << "我是函数调用" << endl;
}
int main() {

	int a = 1;
	char b = 'z';
	fun(a, b);//普通函数调用,可以进行隐式的类型转换
	fun(b, a);//  普通函数调用
	fun(a, a);//调用函数模板(本质:参数类型化),严格按照类型匹配,不会进行类型自动转换
	return 0;
}
#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);
}
int 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;//调用普通函数可以隐式类型转换
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值