函数模板的语法:
template <typename 类型参数1 , typename 类型参数2 , ...> 返回值类型 函数名(形参列表){
//在函数体中可以使用类型参数
}
类型参数可以有多个,它们之间以逗号,
分隔。类型参数列表以< >
包围,形式参数列表以( )
包围。
typename
关键字也可以使用class
关键字替代,它们没有任何区别。C++ 早期对模板的支持并不严谨,没有引入新的关键字,而是用 class 来指明类型参数,但是 class 关键字本来已经用在类的定义中了,这样做显得不太友好,所以后来 C++ 又引入了一个新的关键字 typename,专门用来定义类型参数。不过至今仍然有很多代码在使用 class 关键字,包括 C++ 标准库、一些开源程序等。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#if 0
//int类型数据交换
void MySwap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
//double类型
void MySwap(double& a, double& b){
double temp = a;
a = b;
b = temp;
}
#endif
//模板技术 类型参数化 编写代码可以忽略类型
//为了让编译器区分是普通函数 模板函数
template<class T1,class T2> //template<typename T>告诉编译器 ,下面写模板函数
void MySwap(T& a, T& b){
T temp = a;
a = b;
b = temp;
}
void test01(){
int a = 30;
int b = 20;
//1 自动类型推导,编译器根据你传的值 进行类型自动推导
cout << "a:" << a << " b:" << b << endl;
MySwap(a, b);
cout << "a:" << a << " b:" << b << endl;
double da = 12.3;
double db = 21.1;
cout << "da:" << da << " db:" << db << endl;
MySwap(da, db);
cout << "da:" << da << " db:" << db << endl;
//2. 显式的指定类型
MySwap<int>(a, b);
}
int main(void){
test01();
return 0;
}
函数模板跟普通函数一样,也可以被重载
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
template<class T>
int MyAdd(T a,T b){
return a + b;
}
//普通函数可以进行自动类型转换
//函数模板必须严格类型匹配
int MyAdd(int a,int c){
return a + c;
}
void test01(){
int a = 10;
int b = 20;
char c1 = 'a';
char c2 = 'b';
MyAdd<>(a,b);//限定只使用函数模板
MyAdd(a,c1);//这个调用,函数模板有更好的匹配,于是调用函数模板
MyAdd(a, b);//普通函数int MyAdd(int a,int c)已经能完美匹配,于是调用普通函数
MyAdd(c1,b);//这个调用,函数模板有更好的匹配,于是调用函数模板
}
//函数模板被重载
template<class T>
void Print(T a){
}
template<class T>
void Print(T a , T b){
}
int main(void)
{
test01();
return 0;
}
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!