0

次のように、クラス インスタンスのテキスト記述を ostream に配置したい

ostream << myInstance;

ostream インサーターを宣言する方法を知っています。

ostream& operator<<(ostream&, myClass&);

さまざまなレベルの詳細を ostream に追加できるようにしたいと考えています。2 つ以上の ostream インサーターを定義するか、インサーターに追加の引数を渡すか、インサーターにメソッドを渡すか、または文字列ストリームを返すメソッドを呼び出すことができれば、これを行うことができます (できますか?)

誰かがこの問題を解決しましたか?

4

4 に答える 4

2

ストリーム自体を実際にカプセル化することにより、ストリームに「フラグ」を追加できます。

struct Verbose {
  explicit Verbose(std::ostream* s = 0): _stream(s) {}
  std::ostream* _stream;
};

Verbose operator<<(std::ostream& out, Verbose) {
  return Verbose(&out);
}

次に、冗長出力用の新しい演算子を定義します。

std::ostream& operator<<(Verbose v, MyClass const& mc) {
  assert(v._stream);
  std::ostream& out = *v._stream;

  // ...
  return out;
}

使用法:

std::cout << Verbose() << myInstance << "\n";

Verboseこれはクラスにまったく関連付けられておらず、クラス間で簡単に再利用できることに気付くでしょう。

注:必要に応じて、に追加のパラメーターを追加してVerbose、実際に冗長性のレベルを直接制御することができます。

于 2011-11-23T17:42:02.157 に答える
2

標準的な解決策は、 によって提供されるデータに格納されたフラグまたはその他のフォーマット情報を使用して、カスタム マニピュレータを定義することios::xallocです。何かのようなもの:

int
flagIndex()
{
    static int const theIndex = std::ostream::xalloc();
    return theIndex;
}

std::ostream&
verbose( std::ostream& stream )
{
    stream.iword( flagIndex() ) = 1;
    return stream;
}

std::ostream&
unverbose( std::ostream& stream )
{
    stream.iword( flagIndex() ) = 0;
    return stream;
}

std::ostream&
operator<<( std::ostream& dest, MyClass const& object )
{
    bool verbose = dest.iword( flagIndex() ) != 0;
    //  ...
    return dest;
}

次に、次のように記述できます。

std::cerr << verbose << myObject;
于 2011-11-23T18:05:09.213 に答える
1

にパラメータを追加することはできませんが、詳細パラメータoperator<<を使用してカスタム印刷関数を簡単に定義できます。

void dump(ostream& ostr, const myClass& obj, int verbosity = 1)
{
    if (verbosity > 2)
      ostr << "Very verbose!\n";
    if (verbosity > 1)
      ostr << "Verbose!\n";
    if (verbosity > 0)
      ostr << "Standard!\n";
    ostr << "Minimal.\n";
}

使用法:

dump(cout, myobj);     // Default
dump(cout, myobj, 0);  // Minimal
dump(cout, myobj, 1);  // Default
dump(cout, myobj, 2);  // Verbose
dump(cout, myobj, 3);  // Very verbose

dump()また、デフォルトの詳細度を使用して、に転送するストリーム演算子を提供する必要があります。

ostream& operator<<(ostream& ostr, const myClass& obj)
{
    dump(ostr, obj);
    return ostr;
}

そのようにしたい場合は、senumを使用する代わりに冗長性を宣言することをお勧めします。int

enum Verbosity
{
    MinimalOutput = 0,
    StandardOutput = 1,
    VerboseOutput = 2,
    DebugOutput = 3
};
于 2011-11-23T17:15:23.887 に答える
0

アイテムのフォーマットを変更する標準的な方法は、マニピュレータを実装することです。通常、いくつかのフラグを設定するだけです。次に、インサーターはフラグの状態に基づいてその動作を変更します。

于 2011-11-23T17:15:25.260 に答える