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菜鸟+懒,大家有兴趣的试试吧。

  • 相关阅读:
    python -- 初始函数 函数的定义,函数的返回值以及函数的参数
    python 文件操作: 文件操作的函数, 模式及常用操作.
    第三节 深入JavaScript
    第二节 JavaScript基础
    第一节 JavaScript概述
    面试大纲
    flask
    面试准备
    数据结构与算法 学习
    Linux学习
  • 原文地址:https://www.cnblogs.com/wenlove/p/booloperator.html
Copyright © 2011-2022 走看看