函数模板与普通函数的区别以及调用规则
区别 普通函数可以进行隐式类型转换 模板不可以
调用规则
c++编译器优先考虑普通函数
可以通过空模板实参列表的语法限定编译器只能通过模板匹配
函数模板可以像普通函数那样可以被重载
如果函数模板可以产生一个更好的匹配,那么选择模板
模板的机制
模板并不是万能的,不能通用所有的数据类型
模板不能直接调用,生成后的模板函数才可以调用
二次编译,第一次对模板进行编译,第二次对替换T类型后的代码进行二次编译
main.cpp
#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'; // a = 97
// myPlus(a, c); //类型推导不出来 ,函数模板不可以进行隐式类型转换
cout << myPlus2(a, c) << endl; // 10 + 99 普通函数 可以进行隐式类型转换
}
//2 、普通函数和函数模板的调用规则
template<class T>
void myPrint(T a, T b)
{
cout << "模板调用的myPrint" << endl;
}
template<class T>
void myPrint(T a, T b, T c)
{
cout << "模板调用的myPrint(a,b,c)" << endl;
}
通过模板生成的函数 叫模板函数
//void myPrint(int a, int b, int c)
//{
//
//}
void myPrint(int a, int b)
{
cout << "普通函数调用 myPrint" << endl;
}
void test02()
{
int a = 10;
int b = 20;
//1 、如果出现重载 优先使用普通函数调用,如果只有声明void myPrint(int a, int b);没有实现,出现错误
//myPrint(a, b);//输出:普通函数调用 myPrint
//2、 如果想强制调用模板 ,那么可以使用空参数列表
myPrint<>(a, b);//输出:模板调用的myPrint
//3、 函数模板可以发生重载
int c = 30;
myPrint(a, b, c);//输出:模板调用的myPrint(a,b,c)
//4、 如果函数模板可以产生更好的匹配,那么优先调用函数模板
char c1 = 'c';
char d = 'd';
myPrint(c1, d);//输出:模板调用的myPrint
}
int main(){
//test01();
test02();
system("pause");
return EXIT_SUCCESS;
}