C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板定义
Posted thefist11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板定义相关的知识,希望对你有一定的参考价值。
1. 定义
类似函数模板,类模板以关键字template开始,后跟模板参数列表。在类模板(及其成员)的定义中,我们将模板参数当作替身,代替使用模板时用户需要提供的类型或值:
template <typename T> class Blob {
public:
typedef T value_ type;
typedef typename std: :vector<T>: :size_ type size_ type;
//构造函数
B1ob() ;
Blob(std: :initializer_ list<T> il) ;
// Blob中的元素数目
size_ type size() const { return data->size(); }
bool empty() const { return data->empty(); }
//添加和删除元素
void push_ back (const T &t) {data->push_ _back(t) ; }
//移动版本,参见13.6.3节(第484页)
void push_ back(T &&t) { data->push_ back(std: :move(t)); }
void pop_ back() ;
//元素访问
T& back() ;
T& operator[] (size_ _type i); // 在14.5节(第501页)中定义
private:
std: :shared ptr<std: :vector<T>> data;
//若data[i]无效,则抛出msg
void check(size_ type i, const std: :string &msg) const;
};
Blob模板有一个名为T的模板类型参数,用来表示Blob保存的元素的类型。eg,我们将元素访问操作的返回类型定义为T&。当用户实例化Blob时,T就会被替换为特定的模板实参类型。
1.1 实例化类模板
- 显式模板实参( explicit template argument)列表,
当使用一个类模板时,我们必须提供额外信息。 额外信息被绑定到模板参数。编译器使用这些模板实参来实例化出特定的类。
eg.
Blob<int> ia; // 空Blob<int>
Blob<int> ia2 = {0,1,2,3,4}; // 有5个元素的Blob<int>
ia和ia2使用相同的特定类型版本的Blob (即Blob)。从这两个定义,编译器会重写Blob模板,将模板参数T的每个实例替换为给定的模板实参,实例化出一个与下面定义等价的类:
template <> class Blob<int> {
typedef typename std: :vector<int>: :size_ type size_ type;
Blob() ;
Blob(std: :initializer_ list<int> il) ;
//...
int& operator[] (size_ type i) ;
private:
std: :shared_ ptr<std: :vector<int>> data;
void check(size_ type i, const std: :string &msg) const;
};
-
对我们指定的每一种元素类型, 编译器都生成一一个不同的类:这两个定义会实例化出两个不同的类。names的定义创建了一个Blob类,每个T都被替换为string。prices的定义生成了另一个Blob类,T被替换为double.
-
一个类模板的每个实例都形成一个独立的类。类型Blob 与任何其他Blob类型都没有关联,也不会对任何其他Blob类型的成员有特殊访问权限。
//下面的定义实例化出两个不同的Blob类型
Blob<string> names; //保存string的Blob
Blob<double> prices;// 不同的元素类型
1.2 在模板作用域中引用模板类型
-
一个类模板中的代码如果使用了另外-一个模板,通常不将一一个实际类型(或值)的名字用作其模板实参。
-
相反,通常将模板自己的参数当作被使用模板的实参。
eg,我们的data成员使用了两个模板,vector和shared_ ptr。 我们知道,无论何时使用模板都必须提供模板实参。
data 使用了Blob的类型参数来声明data是一个shared_ ptr的实例,此shared ptr指向一个保存类型为T的对象的vector实例。
std: :shared_ ptr<std: :vector> data;
Blob,data 为shared ptr<vector>
Blob, data为shared_ ptr<vector>
以上是关于C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板定义的主要内容,如果未能解决你的问题,请参考以下文章
C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move
C++ Primer 5th笔记(chap 16 模板和泛型编程)模板特例化
C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板特例化
C++ Primer 5th笔记(chap 16 模板和泛型编程)实例化