标准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
技巧是否有用?它一般都是一个很好的成语吗?
答案 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 *”。如果同时定义int
和bool
运算符,则会导致bool转换模糊不清。因此,您不能在if
和switch
中使用对象,除了唯一的错误状态转换为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()) { .... }