是否可以让类对象返回true / false值,所以我可以这样做:
MyClass a;
...
if (a)
do_something();
我可以通过重载来完成(几乎)我想要的东西!操作者:
class MyClass {
...
bool operator!() const { return !some_condition; };
...
}
main()
MyClass a;
...
if (!a)
do_something_different();
但我还没有找到一种方法来重载什么是“空”运算符。当然,使用==运算符检查true / false也是可能的,实际上是我到目前为止所做的。
答案 0 :(得分:8)
重载void * cast操作符:
operator void * () const { return some_condition; };
这就是流的工作方式,让您说:
if ( cin ) {
// stream is OK
}
使用void *而不是bool可以防止在某些情况下错误地使用强制转换,例如算术,这是不可取的。当然,除非您想在这些环境中使用它。
答案 1 :(得分:6)
显而易见的解决方案 - 通过bool
向operator bool
隐式转换 - 是一个坏主意。
这就是标准库使用operator void*
的原因,如Neil的回答所示。
然而,值得指出的是,即使这种解决方案也存在缺陷,因此不再被认为是安全的。不幸的是,想出一个更好的解决方案并非易事......
在Artima上有一篇描述safe bool idiom的文章。对于一个真正的库,这绝对是要走的路,因为它提供了最难以使用的最强大的界面。
答案 2 :(得分:5)
很奇怪,到目前为止还没有人提到safe bool idiom。到目前为止所描述的所有其他解决方案都有缺点(您可能会或可能不会关心),所有这些方法都在本文中进行了描述。简而言之,安全的bool成语是这样的:
class Testable {
typedef void (Testable::*bool_type)() const;
void this_type_does_not_support_comparisons() const {}
public:
operator bool_type() const {
return /* condition here */ ?
&Testable::this_type_does_not_support_comparisons // true value
: 0; // false value
}
};
答案 3 :(得分:-1)
尝试重载(bool)运算符:
operator bool() { /* ... */ }