3

ストリームをイテレータのセットとして扱いたいVisualStudio2008C++アプリケーションがあります。

たとえば、ストリームを介してWIN32_FIND_DATA構造体の配列を受信する場合、次のようなことができるようにしたいと思います。

IStreamBuf< WIN32_FIND_DATA > sb( stream );
std::vector< WIN32_FIND_DATA > buffer;
std::copy( std::istreambuf_iterator< WIN32_FIND_DATA >( &sb ), 
           std::istreambuf_iterator< WIN32_FIND_DATA >(),
           std::back_inserter( buffer ) );

これを実現するために、次から派生したクラスを定義しましたstd::basic_streambuf<>

template< typename T >
class IStreamBuf : public std::basic_streambuf< byte >
{
public:

    IStreamBuf( IStream* stream ) : stream_( stream )
    {        
    };

protected:

    virtual traits_type::int_type underflow()
    {
        DWORD bytes_read = 0;
        HRESULT hr = stream_->Read( &buffer_, sizeof( T ), &bytes_read );
        if( FAILED( hr ) )
            return traits_type::eof();

        traits_type::char_type* begin = 
            reinterpret_cast< traits_type::char_type* >( &buffer_ );
        setg( begin, begin, begin + bytes_read );   
        return traits_type::to_int_type( *gptr() );
    };

private:

    // buffer to hold current item of type T
    T buffer_;

    // stream used to receive data
    IStream* stream_;
}; // class IStreamBuf

私が理解できないのは、sの配列からbytesの配列に優雅に移行する方法WIN32_FIND_DATAです。std::basic_streambuf<>テンプレートパラメータが必要なため、またはのような構造体ではなく、またはstd::char_traits<>のような組み込み型のみを使用できるという印象を受けています。正しい?charbyteWIN32_FIND_DATA

これを機能させる方法について何か提案はありますか?

ありがとう、PaulH

4

1 に答える 1

1

istreambuf_iteratorバッファレベルで機能します。バッファレベルでは、バイトのストリームにすぎません。構造を処理する場合は、istream_iterator代わりにを使用しoperator>>て、構造を読み取るためのを作成することをお勧めしますWIN32_FIND_DATA。のプロキシを作成/使用することも検討してくださいWIN32_FIND_DATA

于 2010-05-24T19:41:29.590 に答える