• 函数模板与普通函数的区别以及调用规则


    区别

    • 普通函数可以进行隐式类型转换  模板不可以
    #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;
    }

    结果:

  • 相关阅读:
    深入浅出Blazor webassembly之Local storage
    深入浅出Blazor webassembly之一种简单的部署方法
    深入浅出Blazor webassembly之以SubDirectory方式部署
    深入浅出Blazor webassembly之理解 Blazor WASM
    深入浅出Blazor webassembly之Logging
    [转]解决github不能访问的问题
    深入浅出Blazor webassembly之使用State container机制实现两组件联动
    深入浅出Blazor webassembly之使用EventCallback机制进行组件之间联动
    跳槽一年后的回顾
    Node.js躬行记(12)——BFF
  • 原文地址:https://www.cnblogs.com/yifengs/p/15180421.html
Copyright © 2020-2023  润新知