一、类型参数与模板
1、支持更多类型的冒泡排序函数:引入模板,将类型参数化。
2、模板的实例化与对象实例化。
模板实例化为类--编译期间完成。
类实例化为对象--运行期间完成。
int a = 128, b = 256;
Buffer<double, char, a, b> buf3; // 模板实参不能包含变量、函数调用、变量表达式等运行时对象
二、类模板、函数模板与模板特化
三、模板及其特化语法
1、类模板及其特化语法
1)通用语法
template<class 类型形参1, class 类型形参2,...> class 类模板名{...};
如:template<class T> class comparator{...};
如果在类模板外部定义成员函数:
template<class 类型形参1, class 类型形参2,...> 返回类型 类模板名<类型形参1, 类型形参2,...>::成员函数名(形参表){...}
如:template<class T> int comparator<T>::compare(void){...}
2)特化语法
template<> class 类模板名<类型形参1, 类型形参2,...>{...};
如:template<> class comparator<const char*>{...};
如果只针对类模板中某个成员函数进行特化:
template<> 返回类型 类模板名<类型形参1, 类型形参2,...>::成员函数名(形参表){...}
如:template<> int comparator<const char*>::compare(const char*, const char*){...}
2、函数模板及其特化语法
1)通用语法
template<class 类型形参1, class 类型形参2,...> 返回类型 函数模板名(形参表){...}如:template<class T> int compare (T x, T y) {...}
2)特化语法
template<> 返回类型 函数模板名<类型形参1, 类型形参2,...>(形参表){...}如:template<> int compare (const char* x, const char* y) {...}
四、局部特化与最优匹配
1、编译器优先选择特化程度最高的版本。
template <class T1, class T2> class Pair {...};
template <class T1> class Pair<T1,int> {...};
template <> class Pair<int, int> {...};
2、编译器优先选择针对指针的特化版本
a)template<class T> class Feeb {...};
b)template<class T*> class Feeb {...};
Feeb<char> f1;//a)
Feeb<char*> f2;//b),T->char
3、编译器优先选择参数匹配程度最好的特化版本。
a)template <class T1, class T2, class T3> class Trio{...};
a)template <class T2, class T2> class<T1, T2, T2> Trio{...};
a)template <class T1> class<T1, T1*, T1*> Trio{...};
Trio<int, short, char*> t1;//a
Trio<int, short, short> t2;//b
Trio<char, char*, char*> t3;//c
五、非类型参数与缺省参数
template<class T1, class T2 = double, int Size1 = 128, int Size2 = 256> class Buffer{...
private:
T1 m_t1[size1];
T2 m_t2[size2];
};
Buffer <string, double, 128, 256> buf1;
Buffer <string> buf2;
Buffer <string, int> buf3;
模板参数可以带缺省值,但是与函数的缺省参数一样,必须靠右。
六、与模板相关的相关问题
1、从模板继承:ti.cpp
2、模板型成员变量、模板型成员函数、模板型成员类型:tm.cpp
3、模板的递归实例化:tr.cpp
template<class T1, int size> class B {};
B<B<int, 4>, 3> b;
4、模版型类型参数:tp.cpp
template<class T1> class A {};
template<template<class T1>class T2> class B {};
B<A> b;
七、链表模板
1、链表模板
2、容器
3、迭代器(iterator)。容器模板的内置类型支持如下操作:
1)++ :迭代
2)* :解引用
3)-> :访问成员
4)!= :
正向迭代器(iterator)、常正向迭代器(const_titerator)、反向迭代器(reverse_iterator)、常反向迭代器(const_reverse_iterator)