3 模板
3.1 类模板/函数模板
补充:只有模板的尖括号中<>,关键字 typename
和 class
是一样的
3.2 成员模板
它即是模板的一部分,自己又是模板,则称为成员模板
其经常用于构造函数
- ctor1 这是默认构造函数的实现;它初始化
first
和second
分别为T1
和T2
类型的默认构造函数生成的默认值 - ctor2 这是带参数的构造函数的实现;它接受两个参数
a
和b
,并将它们分别用来初始化first
和second
成员变量 - ctor3 这是一个==模板构造函数==,接受一个不同类型的
pair
对象作为参数;它允许从一个不同类型的pair
对象构造当前类型的pair
对象,在构造过程中,它将源pair
对象的first
和second
成员变量分别赋值给当前对象的成员变量,使其具有一定的灵活性和通用性
template <class T1, class T2>
struct pair
{
T1 first;
T2 second;
pair() : first(T1()), second(T2()) {} //ctor1
pair(const T1& a, const T2& b) : //ctor2
first(a), second(b) {}
template <class U1, class U2> //ctor3
pair(const pair<U1, U2>& p) :
first(p.first), second(p.second) {}
};
-
例一,可以使用 <鲫鱼,麻雀> 对象来构造一个 <鱼类,鸟类> 的pair
-
例二,父类指针是可以指向子类的,叫做 up-cast;智能指针也必须可以,所以其构造函数需要为==模板构造函数==
3.3 模板模板参数
即模板中的一个模板参数也为模板,下图黄色高亮部分
XCLs<string, list> mylist
中即表示:容器 list 是 string 类型的—— 创建一个 string 的链表;Container<T> c;
即表示list<srting> c;
但是这样
Container<T> c;
语法过不了,容器 list 后面还有参数,需要用中间框和下面框下一行的代码 —— c++11的内容
注:下面不是模板模板参数
class Sequence = deque<T>
是有一个初始值,当没指定时就初始为deque<T>
在要指定时,如最后一行中的
list<int>
是确切的,不是模板