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;
    }

    结果:

  • 相关阅读:
    java.util.concurrent学习
    mysql慢查优化总结
    mysql怎么限制某些查询语句的执行?
    数据库操作提交事务如果不关闭,会有什么样的后果?
    apache的500错误是写到哪个文件里面
    apache也可以做负载均衡,跟nignx的区别是什么?
    ajax提交请求为啥url要用这个函数encodeURI
    MySQL性能调优与架构设计读书笔记
    java枚举的作用
    linux的命令
  • 原文地址:https://www.cnblogs.com/yifengs/p/15180421.html
Copyright © 2011-2022 走看看