2014-01-09 2 views
2

Я новичок в boost::iostreams так что это может быть тривиальным:Как труба в станд :: соиЬ с усилением :: iostreams

namespace io = boost::iostreams; Предполагая

это работает

io::filtering_ostream out(std::cout); 
out << "some\nstring\n"; 

и это работает

std::string result; 
io::filtering_ostream out(io::counter() | io::back_inserter(result)); 
out << "some\nstring\n"; 

еще не скомпилировано

io::filtering_ostream out(io::counter() | std::cout); 
out << "some\nstring\n"; 

Как вы трубили в std::cout?

ответ

5

Обертывание std::cout с boost::ref Работа для меня:

io::filtering_ostream out(DummyOutputFilter() | boost::ref(std::cout)); 

Подробнее см. Примечание_1 в pipable docs.

1

Это не так, как вы передаете поток. Вы должны использовать push:

out.push(std::cout); 
+0

Тогда почему работает 'back_inserter'? Есть ли способ «трубы»? –

+0

@ 3noch Что означает 'back_inserter'? Это не поток, это устройство ... – 0x499602D2

+0

Невозможно ли преобразовать 'std :: stream' в устройство? Я ожидаю что-то вроде 'make_device (std :: cout)'. –

2

Для полноты картины, просто "Раковина обертка" выглядит следующим образом:

#include <boost/iostreams/concepts.hpp> 
#include <boost/iostreams/pipeline.hpp> 

template<typename Sink> 
class sink_wrapper 
    : public boost::iostreams::device<boost::iostreams::output, typename Sink::char_type> { 
public: 
    sink_wrapper(Sink & sink) : sink_(sink) {} 

    std::streamsize write(const char_type * s, std::streamsize n) { 
     sink_.write(s, n); 
     return n; 
    } 

private: 
    sink_wrapper & operator=(const sink_wrapper &); 
    Sink & sink_; 
}; 
BOOST_IOSTREAMS_PIPABLE(sink_wrapper, 1) 

template<typename S> sink_wrapper<S> wrap_sink(S & s) { return sink_wrapper<S>(s); } 

И может быть использован, как это:

boost::iostreams::filtering_ostream out(filter | wrap_sink(std::cout)); 
Смежные вопросы