我很好奇fstream
class
如何通过简单地将对象的名称放在条件语句中来返回true
或false
值。例如......
std::fstream fileStream;
fileStream.open("somefile.ext");
if (!fileStream) // How does this work?
std::cout << "File could not be opened...\n";
我问这个是因为如果我以类似的方式使用它,我希望我自己的类返回一个值。
答案 0 :(得分:5)
它并不是真的等于true或false,而是重载!
运算符以返回其状态。
有关详细信息,请参阅http://www.cplusplus.com/reference/iostream/ios/operatornot/。
自己这样做非常简单,请查看operator overloading faq或C++ 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;
}
};