4

私は今飛び込んboost::iostreamsでいて、いくつかを反復するストリームを作成する方法を探していますcontainer<char>

現在、 で機能するコードがありますが、std::vector<char>のみ機能します。特定のコードを書いたからです。std::vector

私は次のことをしています:

template <class Object, class Container>
void Load(Object& object, const Container& container) {

   using namespace boost::iostreams;

   // Create a stream that iterates over vector and use it in
   // the following procedure
   LoadImpl(object, stream<array_source>(&container[0], container.size()));
}

whereLoadImpl(...)は次のように記述されます。

template <class Object
void LoadImpl(Object& object, std::istream& stream) { ... }

また、特定の を使用してシリアル化/逆シリアル化をラップするために使用されstreamます。

Loadルーチンをより一般的なものにする方法について何かアドバイスをいただけますか? たとえば、コンテナstd::vector<char>があればそれに代わる機能が欲しいと思います。std::string

4

3 に答える 3

3

コンテナーをパラメーターとして関数に渡す代わりに、標準ライブラリーのアプローチを使用してイテレーターを使用するのはどうでしょうか?

関数は、コンテナ型ではなく反復子型でテンプレート化され、コンテナの代わりに開始および終了反復子を取ります。次に、指定したコンテナー タイプの範囲を反復処理するのは簡単なことです。

于 2010-06-24T17:05:40.263 に答える
1

標準ライブラリが提供する機能を確認することをお勧めします。
コンテナーを操作するのに役立つイテレーター アダプターのホスト全体があります。

// Copy a stream into a vector
std::vector<char>  vec;    // This could be any container the
                           // code below would still work.
std::copy(std::istreambuf_iterator<char>(std::cin),
          std::istreambuf_iterator<char>(),
          std::back_inserter(vec)
         );

イテレータだけでなく、イテレータを作成するために使用するユーティリティ メソッドによって、すべてを簡単に使用できるようになります。

于 2010-06-24T20:12:49.823 に答える
1

直接的な答えは、イテレータを使用しないことです。私の前の人々は、これがboost::iostreams固有の質問だと誤解していたと思います。

私は boost::iostreams の専門家ではありませんが、Load ルーチンはすでにある程度汎用的であり、std::string でも動作するはずです (ストリーム バッファーを保持するために事前にサイズを変更している場合)。ただし、array_source デバイスを使用することで、コンテナーがランダムにアクセス可能であるという前提に基づいていると思います。たとえば、これは std::list では機能しません。そのため、正しいデバイスが何であるかはわかりませんが、イテレータを使用して機能する別のデバイスが必要です。

于 2010-06-24T20:10:12.737 に答える