У меня есть этот поток, который выполняет декомпрессию с помощью Boost.Iostreams:
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()
для этого?
Это не реально, так как нет 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);
Других решений пока нет …