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;
    }
    
  • 相关阅读:
    cocos2dLua3.17.2当在出厂就为 Android11 Version30的手机上黑屏,无法运行的问题 qd
    cocos2dLua3.17.2 + AS3.5.2 创建工程成功 qd
    getdata软件的使用
    下载及安装Python详细步骤
    【硬件知识】电路图标识符号
    Java中高级开发工程师最新面试题整理
    jquery获得值和控制值
    js 根据日期做星座联动,简洁
    Android remove default apk
    registry collection: right click menu(右键菜单清理)/navigator pane(我的电脑左边栏清理)
  • 原文地址:https://www.cnblogs.com/Sico2Sico/p/5384227.html
Copyright © 2011-2022 走看看