博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective C++ 条款45
阅读量:6236 次
发布时间:2019-06-22

本文共 2845 字,大约阅读时间需要 9 分钟。

本节条款的题目是运用成员模板接受全部兼容类型

作者阐述自己的观点是通过智能指针的样例。

在学习本节条款之前我们要先明确关于隐式转化的问题
例如以下代码:

#include
using namespace std;class A{public: explicit A(int i):a(i){}; A(const A&obj):a(obj.a) { }private: int a;};int main(){ int value =0; A a = value;//编译不通过。由于构造函数中有explicit限定符 return 0; }

我们知道由于explicit限定符的存在编译不通过。

以下我们看另一段书上的代码:

template
class SmartPrt{ public: explicit SmartPtr(T* realPtr); …… }; SmartPtr
pt1=SmartPtr
(new Middle); SmartPrt
pt2=SmartPrt
(new Bottom); SmartPrt
pct2=pt1;
我们能够知道,由于`SmartPtr
`类型和`SmartPtr
`

类型不同。再加上explicit SmartPtr<Middle>中的explicit限定符,SmartPtr<Top> pt1=SmartPtr<Middle>(new Middle);这句代码编译不通过。

并且编译器并不觉得SmartPtr<Top>类型和SmartPtr<Middle>类型存在继承关系。
为了能够实现相互转化。能够加入本节的主旨技术去解决上面出现的问题。
例如以下代码:

template
class SmartPtr{ public: template
SmartPrt(const SmartPrt
& other) :heldPrt(other.get()){}; T* get() const{
return heldPrt;} …… private: T* heldPrt; }; SmartPtr
pt1=SmartPtr
(new Middle); SmartPrt
pt2=SmartPrt
(new Bottom); SmartPrt
pct2=pt1;

我们加入了一个member function template函数。由于typename T和typename U 是两种类型,并且构造函数中没有explicit关键字,不会阻止heldPrt(other.get())的隐式转换

所以,以上代码能够通过编译。

作者最后列出了TR1规范中关于tr1::shared_ptr的一份摘录

例如以下:

template
class shared_ptr{ public: template
explicit shared_ptr(Y* p); template
shared_ptr(shared_ptr
const& r); template
explicit shared_ptr(weak_ptr
const& r); template
explicit shared_ptr(auto_ptr
const& r); template
shared_ptr& operator=(shared_ptr
const& r); template
shared_ptr& operator=(auto_ptr
const& r); …… };

我们能够发现上面仅仅有泛化copy构造函数不是explicit,表示shared_ptr 的隐式转化被同意,而其它的智能指针转化不被同意。

这里另一个须要注意的地方,在class类声明泛化copy构造函数(member template)。并不会阻止编译器生成它们自己的copy构造函数(non-template),换言之。假设程序中仅仅写了泛化的copy构造函数,那么编译器还是会自己主动生成一个非泛化的版本号出来,假设不想要这个缺省版本号,那一定不能偷懒。要两个版本号的copy构造函数都要写。

代码例如以下:

template
class SmartPtr{ public: template
SmartPrt(const SmartPrt
& other) :heldPrt(other.get()){}; SmartPtr(){}//假设不写自己的非泛化构造函数,编译器会自己主动生成自己的默认非泛化构造函数。 T* get() const{
return heldPrt;} …… private: T* heldPrt; };

最后:

作者总结例如以下:
1. 请使用member function templates(成员函数模板)生成“可接受全部兼容类型”的函数。
2. 假设你声明member templates用于“泛化copy构造”或“泛化assignment操作”,你还是须要声明正常的copy构造函数和copy assignment操作符。

转载地址:http://rszia.baihongyu.com/

你可能感兴趣的文章
android新闻项目、饮食助手、下拉刷新、自定义View进度条、ReactNative阅读器等源码...
查看>>
spring-boot下使用LogBack,使用HTTP协议将日志推送到日志服务器
查看>>
不要再问我移动适配的问题了
查看>>
vue-router源码解析(一)
查看>>
利用命令行工具pdftk对PDF进行合并分割
查看>>
04.JavaIO流问题
查看>>
CORS 理解(不要那么多术语)
查看>>
[LeetCode] 767. Reorganize String
查看>>
JS面向对象的程序设计之继承的实现-寄生组合式继承
查看>>
前端--iframe爬坑记录
查看>>
【实践】视频播放成功率下降很多?可能是你密钥管理的方式不对!
查看>>
设计类六大原则
查看>>
Python: kafka-python版本差异导致的问题
查看>>
通过NPD在kubernetes集群上增强节点的错误检测能力
查看>>
Drools 文档(KIE概述)
查看>>
Python进程专题2:multiprocessing创建进程
查看>>
聊聊rocketmq的NettyEncoder及NettyDecoder
查看>>
从0开始用python写一个命令行小游戏(三)
查看>>
ubuntu-desktop安装
查看>>
学会这15点,让你分分钟拿下 Redis 数据库
查看>>