现在越来越懒了,虽然积累的知识越来越多,但写出来的东西越来越少。
趁还有点心情,把刚看的关于safe bool的东西写到这里:
相关url: http://www.artima.com/cppsource/safeboolP.html
这页面上的code有问题,经过调试,并借鉴了一部分http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool里面提到的东西,整理了一份可以编译的code:
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <set>
using namespace std;
  class safe_bool_base {
  protected:
    void this_type_does_not_support_comparisons() const {}
    typedef void (safe_bool_base::*bool_type)() const;
    safe_bool_base() {}
    safe_bool_base(const safe_bool_base&) {}
    safe_bool_base& operator=(const safe_bool_base&) {return *this;}
    ~safe_bool_base() {}
  };
  template <typename T=void> class safe_bool : private safe_bool_base {
  public:
    operator bool_type() const {
      return (static_cast<const T*>(this))->boolean_test() ? &safe_bool<T>::this_type_does_not_support_comparisons : 0;
    }
  protected:
    ~safe_bool() {}
  };
  template<> class safe_bool<void> : private safe_bool_base {
  public:
    operator bool_type() const {
      return boolean_test()==true ? &safe_bool<void>::this_type_does_not_support_comparisons : 0;
    }
  protected:
    virtual bool boolean_test() const=0;
    virtual ~safe_bool() {}
  };
  template <typename T> 
   bool operator==(const safe_bool<T>& lhs, bool b) {
      return (lhs) ? b : !b;
  }
  template <typename T> 
   bool operator==(bool b, const safe_bool<T>& rhs) {
      return (rhs) ? b : !b;
  }
  template <typename T, typename U> 
    void operator==(const safe_bool<T>& lhs,const safe_bool<U>& rhs) {
      lhs.this_type_does_not_support_comparisons(); 
      return false;
  }
  template <typename T,typename U> 
  void operator!=(const safe_bool<T>& lhs,const safe_bool<U>& rhs) {
    lhs.this_type_does_not_support_comparisons();
    return false;   
  }
  class Testable_with_virtual : public safe_bool<> {
  protected:
    bool boolean_test() const {
      // Perform Boolean logic here
      return true;
    }
  };
#if (1)
  class Testable_without_virtual : 
    public safe_bool <Testable_without_virtual> {
  public:
    bool boolean_test() const {
      // Perform Boolean logic here
      return true;
    }
  };
#else
  class Testable_without_virtual : 
    private safe_bool <Testable_without_virtual> {
    template <typename T> friend class safe_bool;
  public:
    using safe_bool<Testable_without_virtual>::operator bool_type;
    bool boolean_test() const {
      return true; // Logic goes here!
    }
  };
#endif
int main(int argc, char* argv[])
{
    Testable_without_virtual t;
    if (t) {
        cout << "OK" << endl;
    } else {
        cout << "FAIL" << endl;
    }
    Testable_with_virtual t2;
    if (t2 == true && true == t2) {
        cout << "OK" << endl;
    } else {
        cout << "FAIL" << endl;
    }
    return 0;
}
当然,上面的代码里有很多技巧,不光是safe bool idiom,对于平日里写代码时,值得借鉴的是:
class A {
    typedef void* A::*unspecified_bool_type;
public:
    /* //别再写这这样的conversion了,用下面的那个
    operator bool() const {
        return _pointer ? true : false;
    }
    */
    operator unspecified_bool_type() const {
        return _pointer ? &A::_pointer : NULL;
    }
private:
    void* _pointer;
};