先看如下代码
template<class T>
T myPlus(T a, T b)
{
return a + b;
}
int myPlus2(int a, int b)
{
return a + b;
}
最直接的区别就是:模板函数比普通函数多了template<class T>,模板函数的参数类型在定义时不确定,而普通函数的参数在定义时就已经确定。
继续看如下测试代码
int b = 20;
char c = 'c'; // a = 97
myPlus(a, c);
以上代码编译无法通过,为什么呢?因为模板函数要求传入的参数必须是一致的类型,很明显a是int ,c 是char ,两个参数的类型不一致,所以无法编译通过。
模板函数和普通函数也可以发生重载
template<class T>
void myPrint(T a ,T b)
{
cout << "模板调用的myPrint" << endl;
}
void myPrint(int a, int b)
{
cout << "普通函数调用 myPrint" << endl;
}
以上代码模板函数和普通函数就发生了重载
测试代码如下
int a = 10;
int b = 20;
myPrint(a, b);
那么此时,调用myPrint(),调用的是模板函数还是普通函数呢?答案是普通函数,因为在重载的情况下,会优先寻找普通函数。
如果我非要让myPrint()调用的是模板函数,应该怎么做呢?只需要在myPrint后面加上<>就可以了,如下
int a = 10;
int b = 20;
myPrint<>(a, b);
那么继续测试如下代码
char a = 10;
char b = 20;
myPrint(a, b);
此时,再调用myPrint()调用的模板函数还是普通函数呢?答案是模板函数,原因是编译器在寻找普通函数时,并没有发现普通函数中有char 类型的参数,所以这时,就优先使用模板函数了。
函数模板也可以发生重载,示例如下
template<class T>
void myPrint(T a ,T b)
{
cout << "模板调用的myPrint" << endl;
}
template<class T>
void myPrint(T a, T b ,T c)
{
cout << "模板调用的myPrint(a,b,c)" << endl;
}