2013-09-03 2 views
2

У меня есть этот поток, который выполняет декомпрессию с помощью Boost.Iostreams:Каков тип базового потока boost :: iostreams :: filtering_stream?

struct istream_zlib 
    : public boost::iostreams::filtering_stream<boost::iostreams::input, char> 
{ 
    istream_zlib(std::istream& in) 
    { 
    push(boost::iostreams::zlib_decompressor()); 
    push(in); 
    } 
}; 

Теперь я хотел бы получить доступ к основному потоку (std::istream& in) позже. Наивно, я думал, что с просьбой о std::istream через component() бы это сделать, но указатель вернусь есть null:

auto ptr = component<std::istream>(1); // ptr is null! 

Какой я должен предоставить component() для делать это?

ответ

3

Это не реально, так как не istream будет выталкиваться в filtering_stream (для моего повышения 1.48 будет boost::iostreams::detail::mode_adapter<boost::iostreams::input, std::istream>, например), вы можете проверить его тип на component_type функции. Однако у меня нет идей, почему вам нужно получить stream от filtering_stream, так как вы отправляете ссылку - вы должны иметь этот объект в местах, где вы используете этот filtering_stream.

Кроме того, вы можете использовать reference_wrapper для этого случая (т.е. push(boost::ref(in));), а затем получить его компоненты с помощью

auto ptr = component<boost::reference_wrapper<std::istream>>(1); 
+0

Я хочу, чтобы получить доступ, где находится курсор через 'tellg()' для вычисления прогресса декомпрессии ... Я буду хранить ссылку на 'std :: istream', но это должно было избежать использования другого члена, если он уже хранится где-то еще, если это возможно. Спасибо, – piwi

+0

@piwi см. Обновленный. – ForEveR

+0

При использовании 'tellg()' в потоке не сообщается обновленная позиция курсора (слишком плохо), ваше решение позволяет получить доступ к базовому потоку! Благодарю. – piwi

Смежные вопросы