C++11新特性(60)- 声明模板类型形参为友元

在《C++ Primer(第五版)》中关于这个话题的表述如下:

 

在新标准中,我们可以将模板类型参数声明为友元:

C++11新特性(60)- 声明模板类型形参为友元

C++11新特性(60)- 声明模板类型形参为友元

此处我们将用来实例化Bar的类型声明为友元。因此对于某个类型名Foo,Foo将成为Bar<Boo>的友元。。。。

 

光看上面的说明,估计好多人还是一头雾水,下面通过一个接近实际开发的例子来进一步说明。

 

应用举例

 

需求

我们希望设计一个对象计数器,希望可以满足如下需求:

使用一个计数器类实现对多数互不相关的类型的计数

希望可以自动防止计数器的误用

 

计数器类

C++11新特性(60)- 声明模板类型形参为友元

如果去掉模板的部分,这个类就是一个简单的单例模式。比较特别的地方是:这个类的所有成员都声明为私有的,只能通过被声明为友元的Type类型来使用。

 

计数器类使用示例

C++11新特性(60)- 声明模板类型形参为友元

C++11新特性(60)- 声明模板类型形参为友元

定义了两个完全不相关的类,分别实例化ObjectCounter类并对对象进行计数。

 

输出结果

C++11新特性(60)- 声明模板类型形参为友元

C++11新特性(60)- 声明模板类型形参为友元

计数结果正确记录了a1,a2,b三个对象的创建和销毁过程。

 

作者观点

 

只要能和实际开发中的需求结合起来,应该没有什么不能理解的语法。

 

觉得本文有帮助?请分享给更多人。

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

C++11新特性(60)- 声明模板类型形参为友元