6

我很好奇如何通过简单地将对象的名称放在条件语句中fstream class来返回 a trueor值。false例如...

std::fstream fileStream;
fileStream.open("somefile.ext");

if (!fileStream)  // How does this work?
  std::cout << "File could not be opened...\n";

我问这个是因为如果我以类似的方式使用它,我希望我自己的类返回一个值。

4

2 回答 2

6

它并不是真的等于真或假,而是它重载了!运算符以返回其状态。

有关详细信息,请参阅http://www.cplusplus.com/reference/iostream/ios/operatornot/

自己做这件事非常简单,请查看运算符重载常见问题解答C++ 运算符重载指南

编辑:有人向我指出,这ios也重载了void *转换运算符,在失败的情况下返回一个空指针。因此,您也可以使用前面提到的常见问题解答中也涵盖的方法。

于 2012-04-11T00:16:27.170 回答
3

这使用转换运算符工作。请注意,看似显而易见的方式转换为具有意想不到的副作用,因此应使用bool隐式转换为内置类型的转换,例如:bool

class X
{
public:
  void some_function(); // this is some member function you have anyway
  operator void(X::*)() const
  {
    if (condition)
      return &X::some_function; // "true"
    else
      return 0; // "false"
  }
};

在 C++11 中,您可以进行bool显式转换,从而避免意外的副作用。因此,在 C++11 中,您可以简单地编写:

class X
{
public:
  explicit operator bool() const
  {
    return condition;
  }
};
于 2012-04-11T00:22:16.173 回答