1

一部のC++コードをUnixからLinux(Red Hat)に移植しています。

私は次のパターンに遭遇しました:

ostream& myfunction(ostream& os)
{
  if (os.opfx())
  {
    os << mydata;
    os.osfx();
  }
  return os;
}

これらの機能はopfxosfxRedHat4.5では使用できません。私はここで機能を使用するための提案を見ましたostream::sentry

ostream& myfunction_ported(ostream& os)
{
  ostream::sentry ok(os);
  if (ok)
  {
    os << mydata;
  }
  return os;
}

ここopfxから、ストリームの状態を確認してからフラッシュして続行することが目的であることがわかります。

私の質問:

ostream関数は、ストリームを操作する前に、すでにストリームの状態をチェックしていると思いました。これは本当ですか?これはある時点で真実ではなかったのですか?

交換opfxsentry必要ですか?まだ私に与えていないものは何sentryを私にoperator<<与えますか?

4

1 に答える 1

1

既存のインサーターは(本当にひどくバグがない限り)すでに歩哨オブジェクトを作成しているので、既存のインサーターを介して作業を行う限り、自分で歩哨オブジェクトを作成する必要はありません。

既存のインサーターの助けを借りずに、自分でデータをストリームバッファーに直接書き込む場合(つまり、歩哨を作成する他のものを使用していない場合)、歩哨オブジェクトを作成する必要があります

このコードでは、歩哨オブジェクトの作成を完全に排除して、次のようなことを行うことができます。

ostream& myfunction(ostream& os)
{
    return os << mydata;
}

既存のコードはを返すように宣言されていますがostream &、実際には何も返さないようであることに注意してください。

于 2010-08-13T18:40:39.740 に答える