C++编程语言中的模板应用对于程序开发是一个非常重要应用。其中,C++函数模板能以同样的程序代码对不同类型的数据进行处理,其关键是将所处理的数据类型说明为参数,即类型参数化。
定义函数模板的一般形式是:
- template <class 类型参数名1 ,class 类型参数名 2,…>
- 函数返回值类型 函数名(形参表)
- {
- 函数体
- }
说明:
(1)这里的类型参数名就是代表形形色色数据类型的通用参数名,它可以代表基本数据类型,也可以代表类。
(2)编写C++函数模板的方法是:
step 1:定义一个普通的函数,数据类型采用具体的普通的数据类型,仍以打印数组为例,先定义一个打印整型数组的普通函数:
- void printArray(int *array,int count)
- {
- for (int i=0;i<count;i++)
- cout<<array[i]<<" ";
- cout <<endl;
- }
step 2:将数据类型参数化:将其中具体的数据类型名(如 int )全部替换成由自己定义的抽象的类型参数名(如T)。
step 3:在函数头前用关键字template引出对类型参数名的声明。这样就把一个具体的函数改造成一个通用的函数模板:
- template <class T>void printArray(T *array,int count)
- {
- for (int i=0;i<count;i++)
- cout<<array[i]<<" ";
- }
#t#(3)C++函数模板不是一个可以执行的函数,它只是对函数功能的程序描述,编译程序不为它生成执行代码。
(4)当编译程序遇到函数调用:
函数名 (实参表)时,自动将实参表中具体的数据类型替换函数模板中的类型参数,生成一个隐含的重载函数,该重载函数的程序代码与函数模板相同,类型则采用实参表中的具体数据类型。仍以前面所创建的打印数组C++函数模板为例,当程序出现函数调用语句printArray(a,aCount);时,编译程序将根据第一个实参a的数据类型int 匹配类型参数T,将函数模板中的所有T都替换成具体的数据类型int,从而产生一个具体的可执行函数的定义(这个过程称为模板实例化):
- void printArray(int *array,int count);