重载函数模板
和普通函数一样,函数模板也可以被重载
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
//1、求两个int值的最大值,
inline int const& Max(int const& a, int const& b){
return a<b ? b:a;
}
//2、求两个任意类型值中的最大者,通过传引用进行调用
template<class T>
inline T const& Max(T const&a, T const& b){
return a<b ? b:a;
}
//3、求三个任意类型值中的最大者,通过传引用进行调用
template<typename T>
inline T const& Max(T const& a, T const& b, T const& c){
return max(max(a,b),c);
}
//也可以为指针和普通的字符串重载这个求最大值的模板
//求两个指针所指向值的最大者
template<typename T>
inline T* const& Max(T* const& a, T* const& b){
return *a<*b ? b:a;
}
//求两个c字符串的最大者
inline char const* const& Max( char const* const& a, char const* const& b){
return strcmp(a,b)<0 ? b:a;
}
int main(){
cout<<Max(7,12,68)<<endl;//调用具有3个参数的模板,即第3个函数
cout<<Max('a','b')<<endl;//调用max<char>(通过实参演绎),即第2个函数
cout<<Max(42.5,22.5)<<endl;//调用max<double>(通过实参演绎),即第2个函数
cout<<Max<>(7,42)<<endl;//调用max<int>(通过实参演绎)
cout<<Max<double>(7,42)<<endl;//调用max<double>(没有实参演绎),即第2个函数
cout<<Max(7,42)<<endl;//调用int重载的非模板函数,即第1个函数
/***********************对于不同类型的参数,只允许使用非模板函数*******************/
cout<<Max('a',107.7)<<endl;//通过int重载的非模板函数,即第1个函数
cout<<Max(7,33.5)<<endl;//调用int重载的非模板函数,即第1个函数
int a=7;
int b=43;
string s="hey";
string t="you";
cout<<Max(s,t)<<endl;//求两个string类型的最大值
int*p1=&a;
int*p2=&b;
cout<<Max(p1,p2)<<endl;
char const*s1="david";
char const*s2="nico";
cout<<Max(s1,s2)<<endl;
system("pause");
}
总结:
1、模板函数为不同的模板实参定义了一个函数家族
2、当你传递模板实参的时候,可以根据实参的类型来对函数模板进行实例化
3、可以显式指定模板参数
4、可以重载函数模板
5、当重载函数模板时,把你的改变限制在:显式地指定模板参数
6、一定要让函数模板得所有重载版本的声明都位于它们被调用的位置之前