覆盖operator void *以返回状态

时间:2011-12-15 15:04:12

标签: c++ operator-overloading

标准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技巧是否有用?它一般都是一个很好的成语吗?

2 个答案:

答案 0 :(得分:4)

  

一般来说它是一个很好的习语吗?

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

请注意,这不会影响switch - 为了能够使用它,您需要将转换运算符设置为整数或枚举。

答案 1 :(得分:0)

如果您只有一个错误状态,则enum即可。只需将0分配给该错误状态。

否则你需要一个class。但class中无法使用switch,您需要转换运算符为整数类型(bool,int,chat,enum等)。一旦定义了这样的转换运算符,当上下文需要bool值时,它们的优先级高于“void *”。如果同时定义intbool运算符,则会导致bool转换模糊不清。因此,您不能在ifswitch中使用对象,除了唯一的错误状态转换为0。

但是,你可以使用safe-bool习语(不要使用operator bool,它可以在意外切换中使用),并添加一个函数来返回枚举,或者整数用于切换。

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()) { .... }