zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    第九十一天 how can I 坚持 技术-永远的技术
    第九十天 how can I 坚持
    Java控制台中输入中文输出乱码的解决办法
    【体系结构】转移预测器设计与比较1
    Ubuntu 13.04 用Sublime Text 2 编译运行 JAVA
    HDU 4605 Magic Ball Game (在线主席树|| 离线 线段树)
    个人重构机房收费系统之报表
    快速排序的递归和非递归实现
    HDU 3721 Building Roads (2010 Asia Tianjin Regional Contest)
    体验决定深度,知识决定广度。你的人生是什么呢? 操蛋和扯蛋没必要纠结 唯有继续
  • 原文地址:https://www.cnblogs.com/Sico2Sico/p/5384227.html
Copyright © 2011-2022 走看看