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>