BZ易风

导航

 

区别

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

结果:

 

posted on 2021-08-24 15:09  BZ易风  阅读(92)  评论(0编辑  收藏  举报