分享

解读boost库的unspecified

 honeyeyo 2016-06-29

在boost的智能指针(包括scoped_ptr,scoped_array,shared_ptr,shared_array)里,会看到每个类都有一个成员函数(就称其为函数吧)operator unspecified_bool_type() const,而且是public的,如果你看过源码,也许会产生如何使用的困惑,下面贴出源码。

  1. typedef T * this_type::*unspecified_bool_type;  
  2.   
  3. operator unspecified_bool_type() const // never throws  
  4. {  
  5.   return ptr == 0? 0: &this_type::ptr;  
  6. }  

当定义一个智能指针类的对象,用if语句判断对象是否为空指针的时候(先看下面的代码),也许还会有困惑。

  1. scoped_ptr<A> ptr(new A);  
  2.   
  3. if (ptr)  
  4. {  
  5.   // ...  
  6. }  

至少我曾经有过这样的困惑,因为有不解,所以才去解读它。上面的两个困惑其实是一个问题(提前告诉你哈~),就是boost智能指针对bool语境的支持,智能指针之所以要支持bool语境,是为了在使用上接近原始指针。

先从下面这一句开始解读,

  1. typedef T * this_type::*unspecified_bool_type;  
这一句是声明了个指向this_type类成员变量的指针的类型,声明一个指向类成员变量的指针类型的格式:类型 类名::*指针类型,不明白可以参考下指向类成员函数的指针。
关于this_type,scoped_ptr代码中有typedef scoped_ptr<T> this_type;
通过这句代码得到的信息有:
1) unspecified_bool_type是个类型,而不是变量,由typedef得知。
2) unspecified_bool_type是scoped_ptr<T>类的成员变量的类型,该成员变量的类型是T *。

接下来分析这个函数:
  1. operator unspecified_bool_type() const // never throws  
  2. {  
  3.   return ptr == 0? 0: &this_type::ptr;  
  4. }  

相信不少程序员都在这里卡住了,至少我是。原因是不知道operator关键字除了操作符重载外,还有另外一种用法,那就是隐式类型转换,没错,格式就是这样:

operator type() {

...

}

执行if (ptr)时候便会执行operator unspecified_bool_type() const,转嫁成判断unspecified_bool_type类型的指针是否为空。


(完)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多