1.2.2 如何使用函数模板
模板可以指导编译器为特定的类型自动生成所需的函数或者数据结构。利用例1.3中的函数模板分别从一个整数数组及一个指针数组中搜索最大值的代码如例1.4所示。
例1.4
- #include <iostream>
-
- template<typename T>
- T const& max_element(T const *l, unsigned sz)
- {/*同例1.3,略*/}
-
- int main()
- {
- int l[] = {2, 0, 1, 1, 0, 8, 2, 5};
- char cl[] = "August";
-
- using namespace std;
- cout << max_element<int>(l, 8) << endl;
- cout << max_element<char>(cl, 6) << endl;
-
- return 0;
- }
可以像调用一个普通函数那样调用函数模板。不同之处在于,调用函数模板时需要指明模板参数的“值”。对于类型参数,其“值”即为具体类型如int、char或者是用户自定义的类。根据所给定的模板参数值以及完整的函数模板声明,编译器可自动生成一个对所需数据类型进行操作的函数,称为函数模板实例。模板参数的值在函数模板名后接尖括号内声明。如例1.4中main函数中对max_element的调用,在函数名后紧跟<int>来声明模板参数的值是一个整数类型,指示编译器利用max_element模板生成一个可以处理整数数组的函数模板实例。而第二次调用max_element时,模板参数值是char字符型,则编译器可生成处理字符数组的真实函数。
可见,虽然C++(www.cppentry.com)无法如弱类型语言那样一个函数处理各种类型,但为各种类型写相似代码的重复性工作,可以借助模板交给编译器去完成。并且,由于是在编译期间完成依模板生成函数并链接的工作,与之相关的函数调用都是静态调用。较之弱类型语言(如Python)在运行时查看数据类型的动态方法,模板生成的静态调用其运行效率更高。