//max.hpp
template <typename T>
inline T const& max(T const &a,T const &b)
{
return a>b?a:b;
}
template <typename T>
inline T const& min(T const &a,T const &b)
{
return a>b?b:a;
}
inline int const& max(int const &a,int const &b)//非模版的函数可以和一个同名的函数模版同时存在,而且该函数模版还可以被实例化为这个非模版函数
{
//std::cout<<"调用非模版"<<std::endl; //对于非模版函数和同名的函数模版,如果条件都是相同的话,那么在调用的时候,重载解析通常调用非模版
return a>b?a:b;
}
template <typename T>
inline T const& max(T const &a,T const &b,T const &c)
{
return ::max(::max(a,b),c);
}
//main.cpp
#include<iostream>
#include<string>
#include"max.hpp"
#include"max2.hpp"
using namespace std;
//模版在实例化前,先检查模版本身,查看语法是否正确,这里会发现错误的语法,例如漏写;
//在实例化期间,检查模版代码,查看是否所有的调用都有效,这里会发现无效的调用,,例如实例化类型不支持某些函数调用
int main()
{
//使用模版
int i=42;
cout<<"max(7,42):"<<::max(7,i)<<endl;//max()模版每次调用之前都有域限定符::,这是为了确认我们调用的是全局名字空间的max(),
//因为标准库也有一个std::max()模版,在某些情况下可以被使用,因此有时会产生二义性
cout<<"max(7.2,42):"<<::max<int>(7.2,42)<<endl;//用int实例化T
double f1=3.4,f2=-5.2;
cout<<"max(f1,f2):"<<::max(f1,f2)<<endl;
string s1="math";
string s2="lanzhihui";
cout<<"max(s1,s2):"<<::max(s1,s2)<<endl;
//重载函数模版
cout<<"max(4.2,1.2,3.2):"<<::max(4.2,1.2,3.2)<<endl;
string s3="zbc";
cout<<"max(s1,s2,s3):"<<::max(s1,s2,s3)<<endl;
system("pause");
return 0;
}