模板定义
非类型参数的模板实参
模板特化
模板偏特化
模板实例化
编译期计算模板实参:
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){}