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