如何在C ++中使类对象成为检查条件?

时间:2011-10-14 13:09:53

标签: c++ boost

Boost有这样的事情:

void OnAccept( const boost::system::error_code & ec)
{
        if( ec )
        {
         ...
        }
}

error_code是一个班级。要覆盖哪个运算符来创建类对象

5 个答案:

答案 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;
}