假设我有一个可能无法正确初始化的对象,但它不仅仅是指向对象的空指针;它是一个空的或未初始化的成员的对象。但是我希望以一种可读的方式检查它,就好像它是一个指针:
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返回的空操作符(类似于bool operator() {...}
)或任何其他可以实现此目的的技巧或习惯用法。
除notNull()
方法之外的任何可读解决方案的想法?感谢。
答案 0 :(得分:3)
您可以提供类型转换运算符,以允许转换为bool
:
explicit operator bool() const {return intField != 0;}
这允许它在布尔上下文中使用,例如if
条件。 explicit
是可选的,但最好是防止可能令人困惑的转换为数字类型。
另一种方法是使用Boost.Optional或类似方法,使任何类型都可以为空。
答案 1 :(得分:0)
我认为你要小心使用运算符重载来指示有效性或初始化状态 - 特别是如果你将持有指针或对这种类型的对象的引用。
对于这种情况,我建议使用以下显式表示法:
if (Object.isValid()) use(Object);
通过这种方式,对于下一个完全按照您在此处执行操作的代码的人来说,这是显而易见的。对于使用它的人来说,操作符重载应该总是显而易见的,对对象的真/假检查意味着是否存在,不一定是有效或不。