6

オブジェクトの名前を条件ステートメント内に配置するだけで、 がまたは値fstream classを返すことができる方法に興味があります。例えば...truefalse

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

true または false に等しいということではなく、!演算子をオーバーロードしてそのステータスを返すということです。

詳細については、 http://www.cplusplus.com/reference/iostream/ios/operatornot/を参照してください。

これを自分で行うのは非常に簡単です。演算子のオーバーロード FAQまたはC++ 演算子のオーバーロードのガイドラインを確認してください。

ios編集:変換演算子もオーバーロードしvoid *、失敗した場合は null ポインターを返すことが指摘されています。したがって、前述のよくある質問でも説明されているそのアプローチを使用することもできます。

于 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 に答える