01模板学习之函数模板和普通函数的区别
1 函数模板和普通函数的区别
1)函数模板不支持隐式转换,必须全部匹配才能被调用,而普通函数支持隐式转换。
例如:
template<class T> //或者使用typename代替class,两者一样
int MyAdd(T a, T b){
return a+b;
}
int MyAdd(int a, char b){
return a+b;//普通函数自动转换char成int去计算。
}
int main(){
int a=1;
double b=2.0;
MyAdd(a,b);//调用普通函数
int c=1;
int d=2;
MyAdd(c,d);//优先调用模板
return 0;
}
2)当函数模板和普通函数均完全匹配调用者的形参返回值,优先选择普通函数。
例如(将上面的代码char改成int即可):
template<class T> //或者使用typename代替class,两者一样
int MyAdd(T a, T b){
return a+b;
}
int MyAdd(int a, int b){
return a+b;//普通函数自动转换char成int去计算。
}
int main(){
int a=1;
int b=2;
MyAdd(a,b);//两者都完全匹配时,调用普通函数
return 0;
}
上面的两个例子可以总结成:
- 1)函数模板和普通函数均完全匹配时,优先调用普通函数。
- 2)函数模板完全匹配而普通函数不完全匹配时,优先调用模板函数。
- 3)两者均不完全匹配时,并且编译器可以隐式转换则调用普通函数,否则报错。
3)函数模板支持重载
例如:
template<class T>
void MyPrintf(T a){
}
template<class T>
void MyPrintf(T a,T b){
}