博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
条款45:运用成员函数模板结合艘所有的兼容类型
阅读量:6686 次
发布时间:2019-06-25

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

首先看看下面的真实的指针与模板创建的智能指针之间的区别:

1 class Top{...};2 class Middle : public Top{...};3 class Bottom : public Middle{...};4 Top * p1 = new Bottom();5 Top * p2 = new Middle();6 const Top * cp2 = p1;     //ok,没有问题,指针与实际所指之物之间确实是有关系的

但是:

1 template
2 class SmartPtr{3 public:4 explicit SmartPtr(T * ptr);5 ...6 };7 SmartPtr
pt1 = SmartPtr
(new Middle);8 SmartPtr
pt2 = SmartPtr
(new Bottom);9 SmartPtr
cp2 = pt1;

这里的等式左右两边的真正实际并没有任何的关系,只是同一个模板实例化出来的不同模板实例而已。

1 template
2 class SmartPtr{3 public:4 template
5 SmartPtr(const SmartPtr
&other);6 ...7 };

上面这个SmartPtr的构造函数并非是explicit的,因为默认的指针之间可以隐式的相互转换,所以将这点引申到智能指针之上也是无可厚非的。

1 template
2 class SmartPtr{ 3 public: 4 template
5 SmartPtr(const SmartPtr
&other) 6 : heldPtr(other.get()){...} 7 T*get() const{
return heldPtr;} 8 ... 9 private:10 T * heldPtr;11 };
在这种情况下,上面的那个构造函数的定义的意思:存在某个隐式的转换关系,可以将U类型的指针转换成T类型的指针才可以,这正好符合我们想将一个继承体系里面的指针相互转换的这种行为。
 
小结:
    请使用member function templates 生成,可接受所有兼容类型的函数
    对member function template 如果要定义拷贝构造函数以及拷贝赋值运算符(template版本)的话,那么也应该定义一般的构造函数与拷贝赋值运算符(非template版本)。

转载于:https://www.cnblogs.com/-wang-cheng/p/4889818.html

你可能感兴趣的文章