成员模板和参数模板

本文探讨了成员模板和参数模板的概念。在成员模板部分,通过实例1展示了如何在类中定义模板成员,解释了成员模板如何在已知类型参数的情况下使用,并讨论了成员模板函数的隐式实例化。对于参数模板,文章解释了当模板的类型参数是一个模板类时,如何实例化并使用这种模板。示例代码展示了如何在模板类中包含模板类的实例作为成员。

1. 成员模板    

     为了实现STL(标准模板库)的设计。模板可以用作结构,类或模板类的成员。如实例1,定义模板类beta,包含成员数据即模板类hold定义的对象 q,n。成员函数包括模板函数func。头文件包含以下两种模板类定义方法,第一是类中定义。另一种是类外定义。

  实例1 成员模板实例

代码:

#define flag1
#ifdef flag1//直接在模板类内定义模板类
template
class beta
{
	template
	class hold
	{
		V val;
	public:
		hold(const V temp=0):val(temp){}
		void show(){cout< q;
	hold   n;
public:
	beta(int a,T b):q(a),n(b){}//注意此处调用初始化函数,为什么不是V b?
	void show(){q.show();n.show();}
	template
	U func(T t,U u){return (n.value()+q.value())*u/t; }
};
#else //此处在模板类外定义模板类
template
class beta
{
	template//模板类hold的声明
	class hold;
	hold q;
	hold   n;
public:
	beta(int a,T b):q(a),n(b){}//注意此处q(a)调用初始化函数
	void show(){q.show();n.show();}
	template//模板函数声明
	U func(T t,U u);
};
template
template
class beta::hold//注意此处模板类外定义模板类的写法
{
	V val;
	public:
		hold(const V temp=0):val(temp){}
		void show(){cout<
template
U beta::func(T t,U u)
{return (n.value()+q.value())*u/t; }
#endif
结果:
    
分析:

   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>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值