如何覆盖 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 运算符?的主要内容,如果未能解决你的问题,请参考以下文章