1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板成员函数的实例化

C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板成员函数的实例化

时间:2019-08-31 18:53:09

相关推荐

C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板成员函数的实例化

1. 默认情况下,一个类模板的成员函数只有当程序用到它时才进行实例化。

(即使某种类型不能完全符合模板操作的要求(参见9.2节,第294页),我们仍然能用该类型实例化类todo)。

eg.

//实例化Blob<int>和接受initializer_ list<int>的构造函数Blob<int> squares = {0,1,2,3,4,5,6,7,8,9};//实例化Blob<int>: :size() constfor (size_ t i = 0; i != squares.size() ; ++i)squares[i] = i*i; //实例化B1ob<int>: :operator[] (size_ t)

1.1 在类代码内简化模板类名的使用

一个类模板类型必须提供模板实参,在类模板自己的作用域中,我们可以直接使用模板名而不提供实参

//若试图访问一个不存在的元素,BlobPtr抛出一个异常template <typename T> class BlobPtr {public:BlobPtr() : curr(0) {}BlobPtr (Blob<T> &a, size_ t sz = 0) : wptr (a.data),curr (sz) {}T& operator* () const{auto P = check (curr, "dereference past end") ;return (*p) [curr]; // (*p) 为本对象指向的vector}//递增和递减BlobPtr& operator++(); //前置运算符BlobPtr& operator--() ;private://若检查成功,check返回一个指向vector的shared_ ptr std: :shared ptr<std: :vector<T>>check(std: :size_ t, const std: :string&) const;//保存一个weak_ ptr,表示底层vector可能被销毁std: :weak_ ptr<std: :vector<T>> wptr;std: :size_ t curr; //数组中的当前位置};递增和递减实际上是BlobPtr<T>& operator++ () ;B1obPtr<T>& operator--() ;

1.2 在类模板外使用类模板名

当我们在类模板外定义其成员时,直到遇到类名才表示进入类的作用域

//后置:递增/递减对象但返回原值template <typename T> BlobPtr<T> BlobPtr<T>: :operator++ (int){//此处无须检查;调用前置递增时会进行检查BlobPtr ret = *this; //既是 BlobPtr<T>ret = *this;++*this;//推进一个元素;前置++检查递增是否合法return ret; // 返回保存的状态}

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

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

eg,我们的data成员使用了两个模板,vector和shared_ ptr。 我们知道,无论何时使用模板都必须提供模板实参。

data 使用了Blob的类型参数来声明data是一个shared_ ptr的实例,此shared ptr指向一个保存类型为T的对象的vector实例。std: :shared_ _ptr<std: :vector<T>> data;Blob<string>,data 为shared_ ptr<vector<string>>Blob<int>, data为shared_ ptr<vector<int>>

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