关于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/archive/2010/10/14/booloperator.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值