如何覆盖 C++ 类中的 bool 运算符?

Posted

技术标签:

【中文标题】如何覆盖 C++ 类中的 bool 运算符?【英文标题】:How do I override the bool operator in a C++ class? 【发布时间】:2011-08-15 07:53:12 【问题描述】:

我在 C++ 中定义了一个ReturnValue 类,它需要报告一个方法是否成功。我希望类的对象在成功时评估为true,在错误时评估为false。我应该重写哪个运算符来控制我的类的真实性?

【问题讨论】:

在执行此操作之前,请注意实现operator bool 的陷阱:请参阅devx.com/cplus/10MinuteSolution/32145/1954 【参考方案1】:

最好使用 explicit 关键字,否则会干扰其他重载,例如 operator+

这是一个例子:

class test_string

public:
   std::string        p_str;

   explicit operator bool()                  
    
     return (p_str.size() ? true : false); 
   
;

及用途:

test_string s;

printf("%s\n", (s) ? s.p_str.c_str() : "EMPTY");

【讨论】:

考虑explicit operator bool() const noexcept【参考方案2】:

简单的答案是提供operator bool() const,但您可能想查看safe bool idiom,而不是转换为bool(这可能又会隐式转换为其他整数类型),而是转换为不同的类型(指向不接受这些转换的私有类型的成员函数的指针。

【讨论】:

如果您使用最新的编译器,您可以使用新的 C++0x 功能explicit operator bool() 来避免隐式转换。 非常好!为了简单起见,我可能会在我当前的用例中使用简单的operator bool() const,但安全的布尔成语似乎更适合实际生产代码。不过,C++ 迫使你陷入这样的疯狂,这有点令人遗憾。 :-/ @Bo,很幸运,因为这是一个个人项目,我可以选择我的编译器,而 GCC 4.5 支持这一点。谢谢! @Bo,如果您将此作为答案,我会接受,因为这无疑是处理课程真实性的最佳方式。哦,还有来自斯德哥尔摩的问候! :)【参考方案3】:

重载这个操作符:

operator bool();

【讨论】:

【参考方案4】:

好吧,你可以重载operator bool()

class ReturnValue

    operator bool() const
    
        return true; // Or false!
    
;

【讨论】:

以上是关于如何覆盖 C++ 类中的 bool 运算符?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以覆盖 C++ 中的运算符?如果答案是肯定的,范围是多少? [关闭]

c++解决二义性的方法

枚举类中的 c++ 运算符重载

模板类中的 c++ 赋值运算符实现

如何从 C++ 下标运算符所在的类中访问它?

C++,如何在派生类中调用基类的重载提取运算符?