if('fstream object')如何返回true或false值,具体取决于文件是否被打开?

时间:2012-04-11 00:14:13

标签: c++ fstream

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

自己这样做非常简单,请查看operator overloading faqC++ Operator Overloading Guidelines

编辑: 有人向我指出ios也会重载void *转换运算符,在失败的情况下返回空指针。所以你也可以使用这种方法,也包含在前面提到的常见问题中。

答案 1 :(得分: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;
  }
};