template_note

模板定义

非类型参数的模板实参

 

模板特化

 

模板偏特化

 

模板实例化

 

编译期计算模板实参:

template<int *ptr> class Buffer{...};

//错误的实例化

Buffer<new int (100)> bp;

sizeof()表达式的结果是一个常量表达式,可作为非类型模板参数的实参。

eg:

template<int SIZE>Buf{...};

template<int* ptr>class BufPtr{...};

int size=1024;

Buf<size> buf1;//错误:不能在编译时刻被计算出来,虽有变量size存在,但编译期值未确定。

Buf<sizeof(size)> buf2;//OK

BufPtr<&size> ptr;//OK

 

我的理解:编译期先用记号替代模板参数,实例化点在用已知参数替代记号,实际是执行了包含有记号的语句,效果看如下例子:

template<class classType>

class QueueItem

{

//...

public:

//...效率低

QueueItem(const classType& ref)

{

m_item=ref;//item被初始化两次

m_next=0;

}

private:

classType m_item;

QueueItem<classType>*m_next;

//...

} ;

可以改用成员初始化表

QueueItem(const classType& ref):m_item(ref)

{m_next=0;}

 

template<int* ptr> class BufPtr

{...};

//0的类型是int

//不能通过"隐式转换"隐式地转换到空指针

BufPtr<0> nil;//false

 

模板默认参数

 

类模板的static data member:

every instance of class template has it's own static data membet list

 

类模板内声明的嵌套类型,在类定义内可以直接使用,但在类定义外部使用时,必须指定是哪一个实例。

 

成员模板是为了提供抽象容器类型的实现

 

类模板定义:

 

类模板内成员函数模板的显式特化:

某些情况整个类模板的定义对于某个特殊的类型并不合适,可定义类的特化:

注意必须提供每个特化类成员所有函数的定义;且定义无需template<>前缀.

 

类模板的部分特化:

template<int hi ,int wid>

class Screen

{

//...

};

部分特化:

template<int hi>

clas Screen<hi,800>

{

//可能与通用类模板具有完全不同的成员集合

//...

};

template<int hi> Screen<hi,800>::Screen():_height(hi),_cursor(0),_screen(hi*80,bk){}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值