前言
C++ 模版分为函数模版和类模版,和Java中的泛型类似,他们都是为了把类型参数化,因为我们很多时候需要在函数或者类使用的时候再确定类型,比如我们想要定义一个全能数组,调用者可以在数组中插入任意类型的数据,如果不用函数模版的方式,我们就需要写大量的重复代码。需要写不同类型的插入,删除等功能,如果利用模版的技术,只需要写一个插入,删除等功能的函数就能满足用户的需求了。
作用
函数模版的作用是建立一个通用的函数,其函数的返回值类型和形式参数类型都可以不具体指定,用一个虚拟的类型代表。在调用的时候再指定具体的数据类型。增加了代码的复用性。
语法
template<typename T>
函数方法
解释: template: 声明创建的模版
typename: 表面其后的类型是一种数据类型,让编译器不要报错
T:通用数据类型,名称可以自定义,通常为大写字母
注意:typename 可以使用class 代替,即声明模版时也可写成template<class T>的方式,效果是一样的,只是有的人会在函数模版的情况下使用typename,在类模版下使用class.
示例解析
示例
我们用一个简单的两个数交换的例子来解释函数模板的作用。我们先看下代码:
#include<iostream>
using namespace std;
//两个整形交换函数
void swapInt(int &a,int &b)
{
int temp = a;
a = b;
b = temp;
}
//交换两个浮点型函数
void swapDouble(double &a, double &b)
{
double temp = a;
a = b;
b = temp;
}
// 函数模版
template<typename T> // 声明一个模版,告诉编译器后面的代码中紧紧跟的T不要报错,T是一个通用的数据类型
void mySwap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
void test()
{
int a = 10;
int b = 20;
//swapInt(a,b);
mySwap<int>(a,b);
cout<<"a="<< a<<endl;
cout<<"b="<< b<<endl;
double c = 1.1;
double d = 2.2;
mySwap<double>(c,d);
cout<<"c="<< c<<endl;
cout<<"d="<< d<<endl;
}
int main(){
test();
system("pause");
return 0;
}
如上例所示:我们实现两个数交换的函数时,如果不用函数模版,我们需要写多个,就如例子中的交换整型数据时:
//两个整形交换函数
void swapInt(int &a,int &b)
{
int temp = a;
a = b;
b = temp;
}
交换Double型的数据时:
//交换两个浮点型函数
void swapDouble(double &a, double &b)
{
double temp = a;
a = b;
b = temp;
}
这两个交换函数我们发现逻辑都是一样的,但是需要写很多次,假如我们想要交换float,char, string....等,我们就需要写多个逻辑相同的函数,这样是很不好的,代码没有充分的做到复用,所以出现了函数模版的技术:
// 函数模版
template<typename T> // 声明一个模版,告诉编译器后面的代码中紧紧跟的T不要报错,T是一个通用的数据类型
void mySwap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
在上面的代码中,我们将参数的int,double类型都用了一个T代替,在使用的时候,我们想交换啥数据就指定啥类型就可以了:
mySwap<int>(a,b);
cout<<"a="<< a<<endl;
cout<<"b="<< b<<endl;
double c = 1.1;
double d = 2.2;
mySwap<double>(c,d);
cout<<"c="<< c<<endl;
cout<<"d="<< d<<endl;
函数模版的两种使用方式
函数模版在使用时其实有两种方式,一种是自动类型推导,另一种是显式指定类型
int a = 10;
int b = 20;
// 使用函数模版,两种方式
// 1.自动类型推导,不用告诉T是一个int类型
mySwap(a,b);
//2显示指定类型
mySwap<int>(a,b);
cout<<"a="<< a<<endl;
cout<<"b="<< b<<endl;
自动类型推导就是使用模版时不用指定类型,让编译器自己推导出函数的类型:如交换两个整形值时 直接调用
mySwap(a,b);, 而显示指定类型就是告诉编译器调用的函数需要是什么类型的。mySwap<int>(a,b);
总结
通过本文,我们可以总结出以下几点: 1.函数模版的创建利用关键字template 2.使用函数模版有两种方式:自动类型推导和显示指定类型 3.使用模版的目的是为了提高代码的复用性,将类型参数化