Boost有这样的事情:
void OnAccept( const boost::system::error_code & ec)
{
if( ec )
{
...
}
}
error_code
是一个班级。要覆盖哪个运算符来创建类对象
答案 0 :(得分:5)
您应该使用safe bool idiom。这可以防止您在简单地提供转换为bool
时发生的大多数陷阱。
提供一些上下文:如果类型可以通过bool
隐式转换为operator bool() const
,则可以在比较表达式中使用该类型的值,此转换没有任何意义。 C ++ 11解决方案将是一个显式转换运算符。
答案 1 :(得分:1)
您需要为您的班级实施bool转换运算符:
operator bool() const
答案 2 :(得分:1)
好吧,基本上你简单可以重载“operator bool()”以允许自动转换为布尔上下文。
另一个建议是自动转换为void *(operator void *()),因为“除了在布尔上下文中测试它之外,你可以用void *做很多事情。”[1] < / p>
然而,简单的解决方案 - 尽管它可能适用于您的特定环境 - 并非完全没有陷阱。我建议阅读
[1] http://www.artima.com/cppsource/safebool.html
因为它提供了关于该主题的全面讨论(和解决方案)。
答案 3 :(得分:1)
您应该使用强制转换操作符。
我在这里提供一个简短的例子。
#include <iostream>
class A
{
public:
A(bool x) : _value(x)
{}
// cast operator for bool value
operator bool() const
{
return _value;
}
private:
bool _value;
};
int main(int argc, char *argv[])
{
A a(true);
if (a) { // true
std::cout << "true" << std::endl;
} else { //false
std::cout << "false" << std::endl;
}
return 0;
}
答案 4 :(得分:1)
如前所述,使用安全bool习语并考虑实施:
bool operator!() const;
会返回相反的值。
这正是boost :: system :: error_code的作用:
typedef void (*unspecified_bool_type)();
static void unspecified_bool_true() {}
operator unspecified_bool_type() const // true if error
{
return m_val == 0 ? 0 : unspecified_bool_true;
}
bool operator!() const // true if no error
{
return m_val == 0;
}