0

注: より適切な回答を得るために回答に基づいて編集されました。

私は何年にもわたって作成した C++ テンプレートのコレクションを持っており、これを Joop と呼んでいます。これは主に、「汎用」カテゴリに分類されないライブラリで構成されていますが、私がそれらを別のプロジェクトに平手打ちし続けるのに十分有用であるため、それらのほとんどは Boost などの他のライブラリに同等のものはありません。

これらのクラスの 1 つがseqstream. アイデアは、反復可能なシーケンスを通常の STL のようなストリームとして扱うことができるようにすることです。その「文字型」はシーケンスの値の型です。

このクラスの根拠は 2 つあります。まず、潜在的に非線形で不連続なシーケンスを線形かつ連続的に見せるインターフェイスを提示する必要があります。次に、ストリーム内のすべてのオブジェクトを、単一の複雑な大きな文字であるかのように扱う必要があります。ストリームをシーケンスとして扱う標準的な方法があります。

現在、seqstream最初、最後、および現在の要素の 3 つの反復子をラップします。seqstream標準ストリームにbasic_seqbuf差し込めるに置き換えたい。std::basic_streambufこの種の動作を提供するために拡張を開始するためのリソースを誰かが提供できますか?

さらに、writableseqbufが許可されている場合、オブジェクトを に書き込んでもオブジェクトがシリアライズされずseqbuf、メソッドが適切に呼び出されるか、ユーザー指定の挿入反復子 ( など) が使用されます。insert()std::back_insert_iterator

編集:

seqstreamが現在どのように使用されているかの例を次に示します。

// Create a sequence of objects.
std::vector<std::string> sequence;
for (int i = 0; i < 10; ++i) {
    std::ostringstream stream;
    stream << "Element " << i << ".";
    sequence.push_back(stream.str());
}

// Create a seqstream wrapping that sequence.
joop::seqstream< std::vector<std::string> > seqstream(sequence.begin(), sequence.end());

// Read the sequence like a stream.
std::string element;
while (seqstream >> element) // OR seqstream.get(element)
    std::cout << element << '\n';
4

1 に答える 1

1

の例を見ると混乱する可能性がありsstreamますが、新しいストリームクラスはまったく必要ないでしょう。basic_stringstreamソースで例を見てみましょう。そのクラスの唯一の目的は

  • 関数を提供しstrます(基になるバッファーを呼び出すだけですstr
  • メソッドを呼び出すときは、基になるバッファのvtableを避けてください
  • rdbufの戻り値をに変更しますbasic_stringbuf*(ただし、のアクセサーstrが提供されているため、これは不要です)

ストリームクラスはほとんど何もしません。実際には、タイプの基になるバッファを呼び出す以外の機能はありませんbasic_streambuf。たとえば、私はこれを行うことができます:

string str( "Hello, world!" );
stringbuf buf( str ); // subclass of basic_streambuf
iostream pseudo_stringstream( &buf );
    // pseudo_stringstream can do anything a stringstream can do.
    // (not necessarily with the same syntax)

basic_istreamさらに、すべてのストリームは、、、basic_ostreamまたは両方から継承することになっています。ストリームが正しく継承されていない場合、インサーター/エクストラクター関数が機能しない可能性があります。これらのインサーター宣言は完全に問題ありません。

operator<<( ostream os, MyData d ); // not a template at all
       // templated, but requires correct inheritance:
template< class C > operator<<( basic_ostream<C> os, MyData d );

したがって、iostreamの動作が必要な場合は、のサブクラスを実装して、basic_streambufにアタッチする必要がありますbasic_iostream


しかし、あなたの実際の目標は何ですか?通常のイテレータやおそらくいくつかのイテレータに対するメモリバックアップストリームの利点は何back_insert_iteratorですか?シリアル化に反復と同じコードを使用しますか?シーケンスをストリームのように見せるのではなく、を使用してストリームをシーケンスのように見せたいと思うかもしれstream_iteratorません。

于 2010-02-04T00:19:37.793 に答える