c++ 模板笔记

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

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

 

类模板全局特化:

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

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

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

 

类模板局部特化:

None.giftemplate<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.giftemplate<typename T = int>
None.gif
None.gif
class A;
None.gif
None.gifA
<> a; //相当于A<int> a;  遗憾的是不能去掉<>
None.gif

 

类模板的类模板参数:

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

 

成员函数模板:

ExpandedBlockStart.gifContractedBlock.giftemplate<typename T> class A dot.gifpublic: 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.giftemplate<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.giftemplate<typename T> T max( T const&, T const& );

 

函数模板全局特化:

None.giftemplate<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.gifContractedBlock.giftemplate<int size>class Adot.gif{};
None.gif
None.giftemplate
<int lenght> void max(dot.gif);
None.gif
None.gif 
None.gif

 

显式实例化:

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

None.gif 
None.gif

 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值