c++ 模板笔记

那个学习规律是这样的:你常常一次性学习很多东西,但是却绝大部分你实际工作中运用不到,结果就是不久就忘光光。这是可悲的人体结构决定的,但是有折衷的办法,那就是做一个备忘录,因为道理你已经学过了,缺少的是一点让你能够回忆的帮助。

C++模板相当的精妙,有着千奇百怪的专业术语,看上去差不多的术语,指的事情却差很远。下面流水账的记录一下他们的特点:

 

类模板全局特化:

None.gif template < typename T >
None.gif
ExpandedBlockStart.gifContractedBlock.gif
class  A  dot.gif publicvoid showMe()dot.gif{ cout << "A" << endl; } } ;
None.gif
None.gif
// 所谓的特化
None.gif

None.giftemplate
<>
None.gif
ExpandedBlockStart.gifContractedBlock.gif
class  A < int >   dot.gif publicvoid showMe(); } ;
None.gif
None.gif
// 不能写template<>前缀
None.gif

ExpandedBlockStart.gifContractedBlock.gif
void  A < int > ::showMe()  dot.gif { cout << "A<int>" << endl; }
None.gif

 

类模板局部特化:

None.gif template < typename T1, typename T2 >
None.gif
None.gif
class  A;
None.gif
None.giftemplate
< typename T >   class  A < T,T > // 局部特化1
None.gif

None.giftemplate
< typename T >   class  A < T,  int > // 局部特化2
None.gif

None.giftemplate
< typename T1, typename T2 >   class  A < T1 * , T2 *> // 局部特化3
None.gif

None.gif 
None.gif

 

类模板参数缺省:

None.gif template < typename T  =   int >
None.gif
None.gif
class  A;
None.gif
None.gifA
<>  a;  // 相当于A<int> a;  遗憾的是不能去掉<>
None.gif

 

类模板的类模板参数:

None.gif template < template < typename Ta >   class  Tb >
None.gif
ExpandedBlockStart.gifContractedBlock.gif
class  A dot.gif { Tb<int> obj1; Tb<float> obj2 } ;
None.gif
None.gif 
None.gif

 

成员函数模板:

ExpandedBlockStart.gif ContractedBlock.gif template < typename T >   class  A  dot.gif public: template< typename T2> void showMe( T2 );} ;
None.gif
None.gif
// 恶心的定义
None.gif

None.giftemplate
< typename T >
None.gif
None.giftemplate
< typename T2 >
None.gif
ExpandedBlockStart.gifContractedBlock.gif
void  A < T > ::showMe( T2 obj )  dot.gif { cout << "A::showMe(" << obj << "" << endl; }
None.gif
None.gif 
None.gif

 

类模板成员全局特化:

None.gif template < typename T >
None.gif
ExpandedBlockStart.gifContractedBlock.gifclass A 
dot.gif { static int obj; void showMe(); } ;
None.gif
None.gif
// 静态数据成员全局特化
None.gif

None.giftemplate
<>   int  A < void > ::obj  =   110 ;
None.gif
None.gif
// 普通成员全局特化
None.gif

ExpandedBlockStart.gifContractedBlock.giftemplate
<>   void  A < void > ::showMe()  dot.gif { cout << "A<void>::showMe()" << endl; }
None.gif
None.gif 
None.gif

 

函数模板:

None.gif template < typename T >  T max( T const & , T const &  );

 

函数模板全局特化:

None.gif template < typename T >  T max( T  const & , T  const &  );
None.gif
None.gif
// 特化
None.gif

None.giftemplate
<>  T max(  int   const & int   const &  );  // 可以借助函数参数推断模板参数
None.gif

None.gif 
None.gif

 

非类型参数:

ExpandedBlockStart.gif ContractedBlock.gif template < int  size > class  A dot.gif {} ;
None.gif
None.giftemplate
< int  lenght >   void  max(dot.gif);
None.gif
None.gif 
None.gif

 

显式实例化:

ExpandedBlockStart.gif ContractedBlock.gif template < typename T >   class  A dot.gif {} ;
None.gif
None.giftemplate 
class  A < int > // 生成A<int>的实现,这是一种编译器优化
None.gif

None.gif 
None.gif

 

备注1:全局特化后并非模板,可以看成模板的其中一个实例,因此应该避免重定义的情况出现。

备注2:非类型参数只能是整型常数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值