100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板定义

C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板定义

时间:2020-08-04 05:41:59

相关推荐

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]无效,则抛出msgvoid 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的BlobBlob<double> prices;// 不同的元素类型

1.2 在模板作用域中引用模板类型

一个类模板中的代码如果使用了另外-一个模板,通常不将一一个实际类型(或值)的名字用作其模板实参。相反,通常将模板自己的参数当作被使用模板的实参。

eg,我们的data成员使用了两个模板,vector和shared_ ptr

std: :shared_ _ptr<std: :vector<T>> data; Blob<string> => data 为shared_ ptr<vector<string>>Blob<int> => data为shared_ ptr<vector<int>>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。