一,
1,本质:是使用一个万能的虚拟类型,用一个标志来表示类型,不是实际的类型。独立于任何特定类型的编程,c++的一个部分,方便开发提高代码的复用性。
2,定义:
单类定义:template < class 类型名称 >
多类定义:template < class 类型名称 1,class 类型名称 2>
例 如: template < class T1,typename 2>
注 释: template ----- 声明创建模板
typename --(也可以用class代替)表明后的类型是一个通用类型,或许叫做虚拟类型
T1------通用类型或者虚拟类型(理解成类型)可以在函数中直接当做普通类型使用。
多个虚拟类型则使用逗号隔开。
二,函数模板的定义及调用
#include <iostream>
using namespace std;
template <class T1,class T2>
T2 arr(T1 x,T2 y)
{
return x + y;
}
调用方法:
第一种: 函数名 <实际类型1,实际类型2>(参数列表);
显式类型推导 fun<int>(1,2);
第二种: 函数名(参数);
隐形类型推导 fun(1,2)
注意:显示类型推导 参数和推导的类型必须一致。如果有普通函数和模板函数,在调用时可以用显示调用,省略类型的方式 swap<>(1,2)。
三,普通函数和函数模板的区别
#include<iostream>
using namespace std;
int myAdd(int a, int b)
{
return a + b;
}
template<class T>
T myAdd2(T a, T b)
{
return a + b;
}
void test()
{
int a = 10;
int b = 20;
char c = 'c';
//这里进行了隐式的转换,将char转换成了int
cout << myAdd(a, c) << endl;
//这里使用c作为实参就会报错
//cout << myAdd2(a, c) << endl;
//这种情况下就不会报错,会进行隐式转换
cout << myAdd2<int>(a, c) << endl;
}
int main()
{
test();
system("pause");
return 0;
}
1,函数只可以有一种数据类型相匹配。模板有多种类型
2,隐式推导优先使用普通函数,只有普通函数不匹配才使用函数模板
3,函数模板只有在调用时,才会构建函数,而普通函数是在编译时。
4,普通函数调用时候可以发生自动类型转换,而函数模板不行。
5,如果函数模板和普通函数都可以实现,优先调用普通函数
6,