关于bool operator() 几种变种实现的整理

  在meffc++中第28 Smart pointers中,提出如何Testing Smart Pointers for Nullness ,文中指出了为了支持 if (ptn == 0) ,if(ptn!=0), if (ptn) ,if (!ptn),所做的处理,这里,总结下以下各种处理

  1.operator bool() {...} 

     2.operator const void*() {...}

    3. typedef T* (CLASS::*CLASSMEMFUNPT) ();

       operator CLASSMEMFUNPT() {...}

    4. typedef T* CLASS::*CLASSMEM;

      operator CLASSMEM() {...}

    1.比较常见,3, 4,是从boost里偷来的,利用了类函数指针于类成员指针的特性,2.meffc++里介绍的,有个可怕的就是可以在外部delete掉

    代码说话,从一个简单的test开始

#define BOOL_CHECK

#define VOID_THIS_CHECK

#define VOID_CLASS_CHECK

#define CLASSFUN_CHECK

//默认采取第4种

class CTest {

  public:

    CTest(int* pVal) : m_pVal(pVal) {}

#if defined(BOOL_CHECK)

    operator  bool () { return m_pVal != 0;}

#elif defined(VOID_THIS_CHECK)

    operator const void* () {

      return m_pVal == 0? 0 : this;

    }

#elif defined(VOID_CLASS_CHECK)

    class T {}

    operator const T*() {

      return m_pVal==0? 0: reinterpret_cast<T*>(this);

    } 

#elif defined(CLASSFUN_CHECK)

  typedef int* (CTest ::*CLASSMEMFUNPT) ();

  operator CLASSMEMFUNPT() {

    return m_pVal==0? 0: &CTest::get;

  }

#else

  typedef int* CTest::*CLASSMEM;

  operator CLASSMEM() {

    return m_pVal==0? 0: &CTest::m_pVal;

  }

#endif

  int* get() const {return m_pVal;}

private:

  int* m_pVal;

};

主要是做以下测试

CTest t1(new int(100));

a:if (t1)

b:if (!t1)

c:if (t1==0)

d:if (t1!=0)

CTest t2(new int(1));

e:if (t1 == t2)

f:if (t1 != t2)

g:delete t2;

h:float f = t2;

本人初学者,以上代码没有经过编译,本来想输入编编,把结果列个表格出来,没办法 ,偶blog菜鸟+懒,大家有兴趣的试试吧。

原文地址:https://www.cnblogs.com/wenlove/p/booloperator.html