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

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

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