zoukankan      html  css  js  c++  java
  • C++ 函数模板二(函数模板重载)

    //函数模板重载
    #include<iostream>
    using namespace std;
    
    /*
    函数模板会进行严格的类型匹配,模板类型不提供隐式类型转化
    普通函数能够进行自动类型转换
    */
    
    /*
    函数模板重载四大规则
    1 函数模板可以像普通函数一样被重载
    2 C++编译器优先考虑普通函数
    3 如果函数模板可以产生一个更好的匹配,那么选择模板
    4 可以通过空模板实参列表的语法限定编译器只通过模板匹配
    */
    
    template<typename T>
    void Test1(T a, T b){
        cout << "执行了模板函数Test1()" << endl;
    }
    
    void Test2(int a, int b){
        cout << "执行了Test2()" << endl;
    }
    
    void Test1(int a, int b){
        cout << "执行了普通函数Test1()" << endl;
    }
    
    void Test3(int a, int b){
        cout << "执行了普通函数Test3()" << endl;
    }
    
    void ProtectA(){
        int a = 1;
        int b = 2;
        char c = '3';
        //Test1(a, c);  报错   error C2782: “void Test1(T,T)”: 模板 参数“T”不明确
        /*
        因为 a是int型,c是char型  而函数模板要求两个参数都是T型 就是说两个参数的类型必须一致,
        但是 int和char类型不一致  所以报错
        */
        Test2(a, c);//对于普通函数而言,则可以进行隐式类型转换,所以没有问题
    }
    
    void ProtectB(){
        int a=1,b=2;
        char c = '3',d='4';
        Test1(a, b);//这里调用普通函数
        Test1<>(a, b);//这里调用模板函数--规则4
        Test1(c, d);//这里调用模板函数--规则3---假设没有模板函数  仍然会调用普通函数
        Test3(c, d);
    }
    
    void main(){
        ProtectB();
        system("pause");
    }
  • 相关阅读:
    《软件开发这点事儿》作者在MSDN上与您讨论软件开发
    JavaScript的对象观
    Windows操作系统发展简史
    UCenter Home 1.5的基本配置与技巧
    设计模式模版方法(TemplateMethod)
    设计模式访问者模式(Visitor)
    设计模式状态模式(State)
    Ext终于开始收费了
    设计模式观察者模式(Observer)
    设计模式备忘录模式(Memento)
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5656705.html
Copyright © 2011-2022 走看看