攻城狮凌风

成员模板和参数模板

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>




posted on 2014-07-29 21:41  攻城狮凌风  阅读(298)  评论(0编辑  收藏  举报

导航