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

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和友元相关的知识,希望对你有一定的参考价值。

1. 定义

如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例。如果友元自身是模板,类可以授权给所有友元模板实例,也可以只授权给特定实例。

1.1 一对一友好关系

类模板与另一个(类或函数)模板间友好关系的最常见的形式是建立对应实例及其友元间的友好关系。

eg. Blob类应该将BlobPtr类和一个模板版本的Blob相

//前置声明,在Blob中声明友元所需要的
template <typename> class BlobPtr;
template <typename> class Blob; // 运算符==中的参数所需要的
template <typename T> bool operator== (const Blob<T>&const Blob<T>&) ;

template <typename T> class Blob {
	//每个Blob实例将访问权限授予用相同类型实例化的BlobPtr和相
	friend class B1obPtr<T> ;
	friend bool operator==<T> (const Blob<T>&const Blob<T>&) ;
	// 其他成员定义, 与12.1.1 (第405页)相同
};

友元的声明用Blob的模板形参作为它们自己的模板实参。因此,友好关系被限定在用相同类型实例化的Blob与BlobPtr相等运算符之间

Blob<char> ca; // BlobPtr<char> 和operator==<char>都是本对象的友元
Blob<int> ia;// BlobPtr<int>和operator==<int>都是本对象的友元

1.2 通用和特定的模板友好关系

一个类也可以将另一个模板的每个实例都声明为自己的友元,或者限定特定的实例为友元:

//前置声明,在将模板的一个特定实例声明为友元时要用到
template <typename T> class Pal;
class C { // C是一个普通的非模板类
	friend class Pal<C>; //用类C实例化的Pal是C的一个友元
	
	// Pal2的所有实例都是C的友元;这种情况无须前置声明
	template <typename T> friend class Pal2;
};
template <typename T> class C2 { // C2 本身是一个类模板
	// C2的每个实例将相同实例化的Pal声明为友元
	friend class Pal<T>; // Pal 的模板声明必须在作用域之内
	
	// Pal2的所有实例都是C2的每个实例的友元,不需要前置声明
	template <typename X> friend class Pal2;
	
	// Pal3是一个非模板类,它是C2所有实例的友元
	friend class Pal3; //不需要Pal3的前置声明
.};

1.3 令模板自己的类型参数成为友元

可以将模板类型参数声明为友元.

eg. 将用来实例化Bar的类型声明为友元。

对于某个类型名Foo:

Foo将成为Bar<Foo>的友元
Sales_ data 将成为Bar<Sales data>的友元
template <typename Type> class Bar {
	friend Type; // 将访问权限授予用来实例化Bar的类型
	//...
};

注意:虽然友元通常来说应该是一一个类或是一一个函数, 但我们完全可以用一个内置类型来实例化Bar.这种与内置类型的友好关系是允许的,以便我们能用内置类型来实例化Bar这样的类。

以上是关于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 模板和泛型编程)模板实参