zoukankan      html  css  js  c++  java
  • 关于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菜鸟+懒,大家有兴趣的试试吧。

  • 相关阅读:
    Generator函数介绍
    C语言基础三
    C语言基础二
    C语言基础一
    node——路由控制
    Node.js_HTTP模块
    node_Express安装及检验
    conda Pyhon版本切换
    JAVA泛型里面各值代表的意义
    jq实现表格多行列复制
  • 原文地址:https://www.cnblogs.com/wenlove/p/booloperator.html
Copyright © 2011-2022 走看看