普通函数与函数模板的区别:
- 普通函数调用时可以发生自动类型转换(隐式类型转换)
- 函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
- 如果利用指定类型方式,可以发生隐式转换
#include <iostream>
using namespace std;
//普通函数
int myAdd01(int a,int b){
return a+b;
}
//函数模板
template <class T>
T myadd02(T a,T b){
return a+b;
}
void test01(){
int a=10;
char b='a';
cout<<myAdd01(a,b)<<endl; //1.普通函数调用时可以发生自动类型转换(隐式类型转换)
// cout<<myadd02(a,b)<<endl; //2.报错!函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
cout<<myadd02<int>(a,b)<<endl; //3.如果利用指定类型方式,可以发生隐式转换
}
int main() {
test01();
return 0;
}
普通函数与函数模板的调用规则
调用规则如下:
- 1 如果函数模板和普通函数都可以实现,优先调用普通函数
- 2 可以通过函数模板参数列表强制调用函数模板
- 3 函数模板也可以发生重载
- 4 如果函数模板可以产生更好的匹配,优先调用函数模板
#include <iostream>
using namespace std;
void myPrint(int a,int b){
cout<<"普通函数调用"<<endl;
}
template <class T>
void myPrint(T a,T b){
cout<<"模板函数调用"<<endl;
}
template <class T>
void myPrint(T a){
cout<<"模板函数重载调用"<<endl;
}
void test01(){
int a=10;
int b=10;
char c='c';
myPrint(a,b); //1 如果函数模板和普通函数都可以实现,优先调用普通函数
myPrint<>(a,b); //2.可以通过函数模板参数列表强制调用函数模板
myPrint<>(a); //3.函数模板也可以发生重载
myPrint(c); //4.如果函数模板可以产生更好的匹配,优先调用函数模板
}
int main() {
test01();
return 0;
}