C++'重载'if()语句

Fle*_*515 11 c++ if-statement operator-overloading type-conversion

是否有可能改变行为if():

class Foo {
    int x;
};

Foo foo;
if(foo)
Run Code Online (Sandbox Code Playgroud)

只有当值x不是零时才进行?要么...

将显式的用户定义类型转换为int工作/将是一种合适的方法吗?要么...

最好做点什么if(foo.getX())

Yan*_*ang 24

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

explicit operator bool() const 
{ 
    return foo.getX(); 
}
Run Code Online (Sandbox Code Playgroud)

explicit关键字防止隐式转换从Foobool.例如,如果您不小心foo输入了类似的算术表达式foo + 1,则编译器可以在声明operator bool()为as时检测到此错误explicit,否则即使不是意图foo也将转换为bool.

一般来说,表单的成员函数

operator TypeName()
Run Code Online (Sandbox Code Playgroud)

(使用可选explicitconst限定符)是转换运算符.它允许您将类转换为指定的任何类型TypeName.在另一个方向,具有一个参数的构造函数允许您将任何类型转换为类:

class Foo {
  Foo(int x);    // convert int to Foo
  operator bool() const;  // convert Foo to bool
  int x;
};
Run Code Online (Sandbox Code Playgroud)

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

  • 明确表示可能更好. (7认同)

Pra*_*ian 11

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

class Foo
{
  int x;
public:
  operator bool() const
  {
    return x > 0;
  }
};
Run Code Online (Sandbox Code Playgroud)

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

int x = 42 + Foo();
Run Code Online (Sandbox Code Playgroud)

C++ 11允许您将转换运算符声明为explicit,从而仅允许在某些上下文中(例如在if语句中)进行隐式转换,从而解决了此问题.

explicit operator bool() const // allowed in C++11
Run Code Online (Sandbox Code Playgroud)

现在

int x = 42 + Foo();  // error, no implicit conversion to bool
int x = 42 + static_cast<bool>(Foo()); // OK, explicit conversion is allowed
Run Code Online (Sandbox Code Playgroud)