zoukankan      html  css  js  c++  java
  • 函数模板与普通函数的区别以及调用规则

    区别

    • 普通函数可以进行隐式类型转换  模板不可以
    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    using namespace std;
    
    //1.普通函数和函数模板的区别
    template<class T>
    T myPlus(T a, T b)
    {
        return a + b;
    }
    int myPlus2(int a, int b)
    {
        return a + b;
    }
    void test01()
    {
        int a = 10;
        int b = 20;
        char c = 'c';
        cout << myPlus(a, b) << endl;
        //cout << myPlus(a, c) << endl;  //error 两个类型不同 无法自动推导  函数模板不会隐式转换
        cout << myPlus2(a, c) << endl;  //可以运行 因为普通函数会把char类型 按照askii码表转换成数字
    }
    
    
    int main()
    {
        test01();
        system("Pause");
        return 0;
    }

    结果:

    调用规则

    • 编译器优先考虑普通函数
    • 可以通过空模板实参列表的语法限定编译器只能通过模板匹配
    • 函数模板可以像普通函数那样可以被重载
    • 如果函数模板可以产生一个更好的匹配,那么选择模板

     实例:

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    using namespace std;
    
    //1.普通函数和函数模板的区别
    template<class T>
    T myPlus(T a, T b)
    {
        return a + b;
    }
    int myPlus2(int a, int b)
    {
        return a + b;
    }
    void test01()
    {
        int a = 10;
        int b = 20;
        char c = 'c';
        cout << myPlus(a, b) << endl;
        //cout << myPlus(a, c) << endl;  //error 两个类型不同 无法自动推导  函数模板不会隐式转换
        cout << myPlus2(a, c) << endl;  //可以运行 因为普通函数会把char类型 按照askii码表转换成数字
    }
    //2.普通函数和函数模板的调用规则
    template<class T>
    void myPrint(T a, T b)
    {
        cout << "模板调用myPrint" << endl;
    }
    
    void myPrint(int a, int b)
    {
        cout << "普通函数调用myPrint" << endl;
    }
    template<class T>
    void myPrint(T a, T b, T c)
    {
        cout << "模板调用myPrint(a,b,c)" << endl;
    }
    void test02()
    {
        int a = 10;
        int b = 20;
        //1.如果出现了重载,优先使用函数调用, 如果普通函数只有声明没有实现 报错
        myPrint(a, b);  //普通
        //2.如果想强制调用模板 那么可以使用空参数列表
        myPrint<>(a, b);    //模板
        //3.函数模板可以发生重载
        int c = 30;
        myPrint(a, b, c);   //模板
        //4.如果函数模板可以产生更好的匹配,那么有限调用函数模板
        char d = 'd';
        char e = 'e';
        myPrint(d, e);      //模板  因为普通函数需要把char转换成int 而模板可以自动推导成char类型 所以调用模板
    
    }
    
    int main()
    {
        test02();
        //test01();
        system("Pause");
        return 0;
    }

    结果:

  • 相关阅读:
    解决UITableView中Cell重用机制导致内容出错的方法总结
    Hdu 1052 Tian Ji -- The Horse Racing
    Hdu 1009 FatMouse' Trade
    hdu 2037 今年暑假不AC
    hdu 1559 最大子矩阵
    hdu 1004 Let the Balloon Rise
    Hdu 1214 圆桌会议
    Hdu 1081 To The Max
    Hdu 2845 Beans
    Hdu 2955 Robberies 0/1背包
  • 原文地址:https://www.cnblogs.com/yifengs/p/15180421.html
Copyright © 2011-2022 走看看