У меня есть приложение Visual Studio 2008 C ++, в котором я хотел бы рассматривать поток как набор итераторов.
Например, если бы я получил массив потоков 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
Что я не могу понятьиз того, как изящно перейти от массива byte
с к массиву WIN32_FIND_DATA
с.Поскольку для std::basic_streambuf<>
требуется параметр шаблона std::char_traits<>
, у меня сложилось впечатление, что он может использовать только встроенные типы, такие как char
или byte
, а не структуру, подобную WIN32_FIND_DATA
.Правильный?
Какие-нибудь предложения о том, как сделать эту работу?
Спасибо, PaulH