C++ 函数模板
01_函数模板定义.cpp
#include<iostream>
#include <typeinfo>
using namespace std;
#if 0
int MAX(int a,int b)
{
cout<<__func__<<"int,int"<<endl;
return a>b?a:b;
}
char MAX(char a,char b)
{
cout<<__func__<<"char,char"<<endl;
return a>b?a:b;
}
double MAX(double a,double b)
{
cout<<__func__<<"char,char"<<endl;
return a>b?a:b;
}
#endif
//#define MAX(type1 a, type1 b)
//template <class T>
template <typename T>
T MAX(T a, T b)
{
cout<<__func__<<typeid(T).name()<<endl;
return a>b?a:b;
}
int main()
{
cout<<MAX(10,9)<<endl;
cout<<MAX('a','a')<<endl;
cout<<MAX(10.1,9.1)<<endl;
}
02_函数模板使用实际类型.cpp
#include<iostream>
#include<string.h>
using namespace std;
template<unsigned M, unsigned N>
bool compare(char (& a)[M], char(&b)[N])
{
return strcmp(a,b);
}
int main()
{
char s1[]="1234567890";
char s2[]="1234567890";
cout<<compare(s1,s2)<<endl;
}
03_函数模板的重载.cpp
#include<iostream>
#include <typeinfo>
using namespace std;
//函数模板的重载,匹配规则:
//1,对于一个函数调用,其候选函数包括所有的函数模板实参推断成功而导出的函数实例;
//2,模板和非模板都是按类型顺序来转换;
//3,如果有一个函数提高的比其他函数都好的匹配,那么选择此函数:
//A:如果同样好的函数只有一个是非模板的函数,则选择此函数;
//B:如果同样好的函数中没有非模板函数,而有多个模板函数,且其中一个模板比其他模板更特例化,则选择此模板;
//C:否则,此函数调用发生歧义!
template <typename T>
T MAX(T a, T b)
{
cout<<__func__<<typeid(T).name()<<endl;
return a>b?a:b;
}
template<>
int MAX(int a,int b)
{
cout<<__func__<<" int"<<endl;
return a>b?a:b;
}
int main()
{
cout<<MAX(10,9)<<endl;
cout<<MAX('a','a')<<endl;
cout<<MAX(10.1,9.1)<<endl;
// cout<<MAX(1,2,3)<<endl;
}
04_函数模板的重载发生歧义.cpp
#include<iostream>
#include <typeinfo>
using namespace std;
//函数模板的重载,匹配规则:
//1,对于一个函数调用,其候选函数包括所有的函数模板实参推断成功而导出的函数实例;
//2,模板和非模板都是按类型顺序来转换;
//3,如果有一个函数提高的比其他函数都好的匹配,那么选择此函数:
//A:如果同样好的函数只有一个是非模板的函数,则选择此函数;
//B:如果同样好的函数中没有非模板函数,而有多个模板函数,且其中一个模板比其他模板更特例化,则选择此模板;
//C:否则,此函数调用发生歧义!
template <typename T>
T MAX(T a, T b)
{
cout<<__func__<<typeid(T).name()<<endl;
return a>b?a:b;
}
template<class M>
M MAX(M a,M b)
{
cout<<__func__<<" int"<<endl;
// return (a>b?a:b)>c?(a>b?a:b):c;
return a>b?a:b;
}
int main()
{
cout<<MAX(10,9)<<endl;
cout<<MAX('a','a')<<endl;
cout<<MAX(10.1,9.1)<<endl;
// cout<<MAX(1,2,3)<<endl;
}
05_函数模板的特例化.cpp
#include<iostream>
#include <typeinfo>
using namespace std;
//函数模板的重载,匹配规则:
//1,对于一个函数调用,其候选函数包括所有的函数模板实参推断成功而导出的函数实例;
//2,模板和非模板都是按类型顺序来转换;
//3,如果有一个函数提高的比其他函数都好的匹配,那么选择此函数:
//A:如果同样好的函数只有一个是非模板的函数,则选择此函数;
//B:如果同样好的函数中没有非模板函数,而有多个模板函数,且其中一个模板比其他模板更特例化,则选择此模板;
//C:否则,此函数调用发生歧义!
template <typename T>
T MAX(T a, T b)
{
cout<<__func__<<typeid(T).name()<<endl;
return a>b?a:b;
}
//int MAX(int a,int b, int c)
int MAX(int a,int b)
{
cout<<__func__<<" int"<<endl;
// return (a>b?a:b)>c?(a>b?a:b):c;
return a>b?a:b;
}
int main()
{
cout<<MAX(10,9)<<endl;
cout<<MAX('a','a')<<endl;
cout<<MAX(10.1,9.1)<<endl;
// cout<<MAX(1,2,3)<<endl;
}