C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板成员函数的实例化
Posted thefist11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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() const
for (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>>
以上是关于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 模板和泛型编程)实例化