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;
    }
    
  • 相关阅读:
    oracle归档空间不足的问题(rman删除归档日志)
    oracle DG查看延时时间
    Convert JS object to JSON string
    转:微信公众平台开发(80) 上传下载多媒体文件
    生成带参数的二维码
    关闭微信浏览器可以使用
    微信内置浏览器的JsAPI(WeixinJSBridge续)进入全屏
    如何隐藏微信公众平台右上角按钮
    微信公众平台服务号、订阅号的相关说明选择字号:
    微信公众平台群发消息的方法及注意事项
  • 原文地址:https://www.cnblogs.com/Sico2Sico/p/5384227.html
Copyright © 2011-2022 走看看