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 模板和泛型编程)实例化

C++ Primer 5th笔记(chap 16 模板和泛型编程)可变参数模板

C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参