12

是否可以改变行为if()

class Foo {
    int x;
};

Foo foo;
if(foo)

仅当 的值x不是零时才继续?或者...

将用户定义的显式类型转换为 int 是否可行/这是一种合适的方法吗?或者...

最好做类似的事情if(foo.getX())吗?

4

2 回答 2

26

您可以通过定义将对象转换为布尔值operator bool()

explicit operator bool() const 
{ 
    return foo.getX(); 
}

explicit关键字防止隐式转换Foobool。例如,如果你不小心foo输入了一个算术表达式,如果你声明为,foo + 1编译器可以检测到这个错误,否则即使不是有意的也会被转换为。operator bool()explicitfoobool

一般来说,形式的成员函数

operator TypeName()

(带有可选explicitconst限定符)是转换运算符。它允许您将您的类转换为TypeName. 另一方面,具有一个参数的构造函数允许您将任何类型强制转换为您的类:

class Foo {
  Foo(int x);    // convert int to Foo
  operator bool() const;  // convert Foo to bool
  int x;
};

这为您的类定义了隐式转换。如果可能,编译器会尝试应用这些转换(就像它对内置数据类型所做的那样,例如5 + 1.0)。您可以将它们声明explicit为抑制不需要的隐式转换。

于 2013-05-08T02:52:37.340 回答
13

您可以定义一个运算符将对象转换为bool

class Foo
{
  int x;
public:
  operator bool() const
  {
    return x > 0;
  }
};

但这可能会产生意想不到的后果,因为隐式转换到bool您不希望发生转换时。例如

int x = 42 + Foo();

C++11 解决了这个问题,允许您将转换运算符声明为explicit,然后只允许在某些上下文中进行隐式转换,例如在if语句中。

explicit operator bool() const // allowed in C++11

现在

int x = 42 + Foo();  // error, no implicit conversion to bool
int x = 42 + static_cast<bool>(Foo()); // OK, explicit conversion is allowed
于 2013-05-08T02:56:01.400 回答