在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
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/16130
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!