如何通过 boost::iostreams 管道进入 std::cout



我是boost::iostreams新手,所以这可能是微不足道的:

假设namespace io = boost::iostreams;

这行得通

io::filtering_ostream out(std::cout);
out << "somenstringn";

这行得通

std::string result;
io::filtering_ostream out(io::counter() | io::back_inserter(result));
out << "somenstringn";

但这不会编译

io::filtering_ostream out(io::counter() | std::cout);
out << "somenstringn";

你如何进入std::cout

用 boost::ref 包装std::cout对我有用:

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

有关详细信息,请参阅可pipable 文档中的note_1。

为了完整起见,一个简单的"Sink 包装器"如下所示:

#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));

这不是你传递流的方式。您必须使用push

out.push(std::cout);

最新更新