zoukankan      html  css  js  c++  java
  • 条款45:运用成员函数模板结合艘所有的兼容类型

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

    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<typename T>
    2 class SmartPtr{
    3 public:
    4     explicit SmartPtr(T * ptr);
    5     ...
    6 };
    7 SmartPtr<Top> pt1 = SmartPtr<Middle>(new Middle);
    8 SmartPtr<Top> pt2 = SmartPtr<Bottom>(new Bottom);
    9 SmartPtr<const Top> cp2 = pt1;

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

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

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

     1 template<typename T>
     2 class SmartPtr{
     3 public:
     4     template<typename U>
     5     SmartPtr(const SmartPtr<U> &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版本)。
  • 相关阅读:
    EcShop二次开发学习方法
    [ 产品经理 ] 互联网产品经理常用软件及工作平台
    Tengine – Nginx衍生版
    把PHP大牛记下来,方便以后关注
    看了极光推送技术原理的几点思考
    centos磁盘满了,查找大文件并清理
    LNMP一键安装包 PHP自动升级脚本
    微信红包系统设计 & 优化
    程序员每天每周每月每年该做的事
    php中$_REQUEST、$_POST、$_GET的区别和联系小结
  • 原文地址:https://www.cnblogs.com/-wang-cheng/p/4889818.html
Copyright © 2011-2022 走看看