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;
}
原文地址:https://www.cnblogs.com/Sico2Sico/p/5384227.html