1. 成员模板
为了实现STL(标准模板库)的设计。模板可以用作结构,类或模板类的成员。如实例1,定义模板类beta,包含成员数据即模板类hold定义的对象 q,n。成员函数包括模板函数func。头文件包含以下两种模板类定义方法,第一是类中定义。另一种是类外定义。
实例1 成员模板实例
代码:
结果:
分析:
1.成员模板类或者成员模板函数作为模板类成员(类型参数T),在定义的时候,可以把模板类的类型参数视作已知“类型”,然后在这个“非模板”的类使用模板类或者模板函数。这样分析比较方便。
2.成员模板函数的类型隐式实例化。
3.模板类外定义成员模板类或模板函数,并不是所有的编译器都支持。定义的时候,应该使用作用域说明符“::”,表明模板类和模板函数的成员身份。且嵌套说明模板参数。
2. 参数模板
从使用的角度,倘若模板类作为类型参数,即模板的类型参数本身是一个带类型参数的模板类。举例如下:
template<template<template T> class Thing>
class gamma
其中,
template<template T> class
为类型,
Thing
为参数。例如,可以声明这样的对象:
gamma<beta> g;
也就是说,模板类包含某些对象,这些成员对象是实例化模板类beta得到。
见如下代码:
#define flag
#ifdef flag
template< template<typename T> class Thing >
class gamma{
Thing<int> a;
Thing<double> b;
public:
gamma(){}
gamma(int x=0,double y=0,int c1=0,int c2=0):a(c1,x),b(c2,y){}//注意c1,c2的缺省值
void show()
{a.show();b.show();}
};
#endif
模板类型参数是实例1中声明和定义的模板类bata。
可以这样实例化对象:
gamma<beta> p(1,2.34,5,6);
实际上,可以混合使用模板参数和常规参数。声明如下:
template<template<typename T> class Thing,template U,template V>
class alpha{
Thing<U> a;
Thing<V> b;
public:
.......};
这时,成员a,b为泛型而不是上例中硬编码制定类型int和double。当然对象声明也应该更改为:
alpha<beta,int,double>