在boost的智能指针(包括scoped_ptr,scoped_array,shared_ptr,shared_array)里,会看到每个类都有一个成员函数(就称其为函数吧)operator unspecified_bool_type() const,而且是public的,如果你看过源码,也许会产生如何使用的困惑,下面贴出源码。
typedef T * this_type::*unspecified_bool_type; operator unspecified_bool_type() const // never throws { return ptr == 0? 0: &this_type::ptr; }
当定义一个智能指针类的对象,用if语句判断对象是否为空指针的时候(先看下面的代码),也许还会有困惑。
scoped_ptr<A> ptr(new A); if (ptr) { // ... }
至少我曾经有过这样的困惑,因为有不解,所以才去解读它。上面的两个困惑其实是一个问题(提前告诉你哈~),就是boost智能指针对bool语境的支持,智能指针之所以要支持bool语境,是为了在使用上接近原始指针。
先从下面这一句开始解读,
typedef T * this_type::*unspecified_bool_type;这一句是声明了个指向this_type类成员变量的指针的类型,声明一个指向类成员变量的指针类型的格式:类型 类名::*指针类型,不明白可以参考下指向类成员函数的指针。
operator unspecified_bool_type() const // never throws { return ptr == 0? 0: &this_type::ptr; }
相信不少程序员都在这里卡住了,至少我是。原因是不知道operator关键字除了操作符重载外,还有另外一种用法,那就是隐式类型转换,没错,格式就是这样:
operator type() {
...
}
执行if (ptr)时候便会执行operator unspecified_bool_type() const,转嫁成判断unspecified_bool_type类型的指针是否为空。
(完)