假设想要编写函数返回两个数之和,我们往往会定义几个重载函数来实现不同类型的变量相加:
int add(int a,int b) { return (a + b); } double add(double a,double b) { return (a + b); }
这些函数几乎相同,它们之间唯一的区别是形参的类型,每个函数的函数体是相同的。
每个要比较的类型都需要重复函数的函数体,不仅麻烦而且容易出错。更重要的是,需要事先知道空间可能会比较哪些类型。如果希望将函数用于未知类型,这种策略就不起作用了。
我们可以不用为每个类型定义一个新函数,而是只定义一个函数模板(function template)。函数模板是一个独立于类型的函数,可作为一种方式,产生函数的特定类型版本。例如,可以编写名为 add 的函数模板,它告诉编译器如何为我们想要比较的类型产生特定的 add 版本。
template <typename T> T add(T a,T b) { return (a + b); }
模板定义以关键字 template 开始,
后接模板形参表,模板形参表是用尖括号括住的一个或多个模板形参的列表,形参之间以逗号分隔。
模板参数表不能为空
#include <iostream> using spacename std; int mian() { int a = 1,b = 2; double c = 1.1,d = 2.2; add(a,b); add(c,d); return 0; }
对于以上调用编译器将实例化 add 的两个不同版本,编译器将用 int 代替 T 创建第一个版本,并用double代替T 创建第二个版本。
定义类模板:
就像可以定义函数模板一样,也可以定义类模板。
template <class Type> class Queue { public: Queue (); Type &front (); const Type &front () const; void push (const Type &); void pop(); bool empty() const; private: }
类模板也是模板,因此必须以关键字 template 开头,后接模板形参表。Queue 模板接受一个名为Type 的模板类型形参。
使用类模板
与调用函数模板形成对比,使用类模板时,必须为模板形参显式指定实参:
Queue<int> qi; Queue< vector<double> > qc; Queue<string> qs;