测试C++对象的有效性,就好像它是一个指针一样

Test a C++ object validity as though it was a pointer

本文关键字:一个 一样 指针 对象 C++ 有效性 测试      更新时间:2023-10-16

假设我有一个对象可能没有正确初始化,但它不仅仅是一个指向对象的空指针;它是一个成员为空或未初始化的对象。但我想以一种可读的方式检查它,就像它是一个指针一样:

if (Object) use(Object);

例如,Object可能有一个int字段,如果为0,则认为该字段未初始化。然后,我可以做一个超负荷的!像这样的操作员:

bool operator!() const {return intField == 0;}

我可以这样使用:

if (! Object)  initialize (Object);

问题是,如果我想测试相反的条件(非零),我不能只做这个:

if (Object)...

我只发现尴尬的可能性:

if (! (! Object))...  // awful
if (Object.notNull()) // not so bad

最接近我愿望的是令人困惑的:

bool operator()() {return intField != 0;}
if (Object())...   // it looks a lot like an argument-less constructor

AFAIK,没有布尔返回空运算符(类似于bool operator() {...})或任何其他技巧或习语可以实现这一点。

除了notNull()方法之外,还有其他可读解决方案的想法吗?谢谢

您可以提供类型转换运算符,以允许转换为bool:

explicit operator bool() const {return intField != 0;}

这允许它在布尔上下文中使用,例如if条件。explicit是可选的,但这是一个好主意,可以防止可能混淆的数字类型转换。

另一种方法是使用Boost.Optional或类似的方法,使任何类型都可以为null。

我认为您需要小心使用运算符重载来指示有效性或初始化状态,尤其是当您持有指向此类对象的指针或引用时。

对于这种情况,我建议使用以下显式表示法:

if (Object.isValid()) use(Object);

这样,对于下一个阅读您代码的人来说,您在这里所做的事情是显而易见的。运算符重载对使用它的人来说应该总是显而易见的,对对象进行真/假检查意味着它是否存在,而不一定是是否有效

相关文章: