C++ template Day Day Up 第6天 class template

类模板

 

类模板最常见的应用就是容器,比如我们常用的std::vector

假设下面的代码实现一个Stack

template < typename T >
class  Stack
{..
}
;

 

Usage: Stack<int>

上面的代码很容易理解,这个是类模板最基础的用法,在任何C++的书籍当中都可以学习到,让我们加快脚步。

Specializations of Class Templates

上面这个单词的典型翻译我不懂(实例化,特化,很乱……),建议还是记住这个单词吧。

当我们的模板类在处理特定类型的时候需要不同的操作的时候,我们可以利用specialization,例如对于char*的字符串进行比较的时候用<明显是错误的,可以重写一个char*版本的并调用strcmp来判断。

下面举一个不太实际的例子(因为没有必要为string单独specialization):

 

template <>  
class  Stack < std:: string >  
  … 
}
;

void  Stack < std:: string > ::push (std:: string   const &  elem) 

    elems.push_back(elem);    
// append copy of passed elem 
}

 

 

这里重点演示specialization的语法。

 

Partial Specialization

这个特性在Generic Programming中非常常用,还是看例子:

 

如果用

MyClass<int,int> m;

会有二义性错误,因为compiler不知道是<T,T>还是<T,int>

当然

MyClass<int*,int*>也是有二义性的。

 

需要注意的是,在partial specialization的时候,需要参数列表中的参数个数与原始的模板类所指定的参数个数相同。

 

Partial specialization有什么用呢,下面的代码给人以无限的遐想:

template  < class  Window,  class  Controller >
class  Widget
{
   ... generic implementation ...
}
;
template 
<>
class  Widget < ModalDialog, MyController >
{
   ... specialized implementation ...
}
;
//  Partial specialization of Widget
template  < class  Window >
class  Widget < Window, MyController >
{
   ... partially specialized implementation ...
}
;

Default Template Arguments

template  < typename T, typename CONT  =  std::vector < T >   >  
class  Stack 
  
private
    CONT elems;               
// elements 

}

template  < typename T1, typename T2 >  
class  MyClass 
  … 
}

//  partial specialization: both template parameters have same type 
template  < typename T >  
class  MyClass < T,T >  
  … 
}


//  partial specialization: second type is int 
template  < typename T >  
class  MyClass < T, int >  
  … 
}


//  partial specialization: both template parameters are pointer types 
template  < typename T1, typename T2 >  
class  MyClass < T1 * ,T2 *>  
  … 
}
;


MyClass
< int , float >  mif;     //  uses MyClass<T1,T2> 
MyClass < float , float >  mff;   //  uses MyClass<T,T> 
MyClass < float , int >  mfi;     //  uses MyClass<T,int> 
MyClass < int * , float *>  mp;    //  uses MyClass<T1*,T2*>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值