#include <iostream>
using namespace std;
//函数模板与普通函数的区别以及调用的规则
//1,普通函数与函数模板的区别:
template<class T>
T myPlus(T &a, T &b)
{
return a + b;
}
int myPlus2(int a, int b)
{
return a + b;
}
void test01()
{
int a = 10;
int b = 20;
cout << myPlus(a, b) << endl;
cout << myPlus2(a, b) << endl;
char c = 'a';
//cout << myPlus(a, c) << endl;//报错//类型推导不出来,函数模板不能进行隐式类型转换;
cout << myPlus2(a, c) << endl;//普通函数,可以进行隐式类型转换;
}
//2.普通函数和函数模板调用规则:
template<class T>
void myPrint(T &a, T &b)
{
cout << "调用的是函数模板" << endl;
}
void myPrint(int a, int b)
{
cout << "调用的是普通函数" << endl;
}
void test02()
{
int a = 10;
int b = 20;
myPrint(a, b);
}
//结果是调用的普通函数;
//如果出现函数重载,优先调用普通函数;
//如果重载的普通函数没有写实现,则会报错;
//如果想强制使用函数模板,则可以使用空参数列表:
//例如下:
void test03()
{
int a = 10;
int b = 20;
myPrint<>(a, b);
}
//3.函数模板也可以发生重载:
template<class T>
void myPrint3(T &a, T &b, T &c)
{
cout << "调用的是3个参数的myPrint3" << endl;
}
template<class T>
void myPrint3(T &a, T &b, T &c,T &d)
{
cout << "调用的是4个参数的myPrint3" << endl;
}
void test04()
{
int a = 10;
int b = 20;
int c = 30;
int d = 40;
myPrint3(a, b, c);
myPrint3(a, b, c, d);
}
//4.如果函数模板可以产生更好的匹配,那么优先使用函数模板:
void test05()
{
char a = 'a';
char b = 'b';
myPrint(a, b);
}
//调用的是函数模板;
int main()
{
test01();
test02();
test03();
test04();
test05();
return 0;
}