【问题标题】:Overriding operator void * for return status覆盖运算符 void * 以返回状态
【发布时间】:2011-12-15 15:04:12
【问题描述】:

标准的ios 类覆盖了 void * 运算符,使其可以在条件中使用。

if (std::cin) { ... }

我有一个类,它的函数返回一个状态。

Status DoSomething()

如果使用不需要细粒度的返回状态,那么能够在 if 语句中使用 Status 会很好。

if (DoSomething()) { ... }  // just want to know if pass or fail

// or if I need more info
Status s = DoSomething()
switch (s) { ... }

ios 技巧是否适合这个用例?总的来说,它甚至是一个好的成语吗?

【问题讨论】:

  • 什么是状态?枚举、类或只是#define int?
  • 它可以是任何使实现我想要实现的目标最安全(最好是最简单)的东西。

标签: c++ operator-overloading


【解决方案1】:

一般来说,它甚至是一个好的成语吗?

没有。在 C++03 中,您应该改用 safe-bool idiom。在 C++11 中,您应该使用 explicit operator bool。切勿使用operator void* 进行布尔转换。显然,它们必须在 Status 类型上定义。

请注意,这不会影响switch — 要能够使用它,您需要有一个转换为整数或枚举的运算符。

【讨论】:

  • 很好,感谢您的链接。我真的很喜欢 Cat Plus Plus 这个名字。 :)
  • 如果存在转为枚举或整数的情况,转为bool时优先级高于operator void*
【解决方案2】:

如果您只有一个错误状态,enum 就可以了。只需将 0 分配给那个唯一的错误状态。

否则您需要class。但是class 不能在switch 中使用,您需要将运算符转换为整数类型(bool、int、chat、enum 等)。一旦定义了此类转换运算符,当上下文需要布尔值时,它们的优先级高于“void*”。如果同时定义 intbool 运算符,它们将导致 bool 转换不明确。所以你不能同时在ifswitch中使用一个对象,除了唯一的错误状态被转换为0。

但是,你可以使用safe-bool idiom(不要使用operator bool,它可能会在switch中意外使用),并添加一个函数来返回enum,或者integer用于switch。

class Status {
public:
    enum Code {
        RUNNING = 1,
        IDDLE = 2,
        ERROR = -1,
        STOPPED = -2
    };

    explicit Status(Code code) : code_(code) {}

    bool ok() const { return code_ > 0; }

    operator void*() const
    { return ok() ? const_cast<Status*>(this) : 0; }

    bool operator!() const
    { return !ok(); }

    Code code() const { return code_; }

private:
    Code code_;
};

Status s(Status::STOPPED);

if (s) { .... }
switch (s.code()) { .... }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多