How can I compose output streams, so output goes multiple places at once?

boost, c++, iostream, stream, tee

Solution

You mention having not found anything in Boost.IOStreams. Did you consider tee_device?

Problem

I'd like to compose two (or more) streams into one. My goal is that any output directed to `cout`, `cerr`, and `clog` also be outputted into a file, along with the original stream. (For when things are logged to the console, for example. After closing, I'd like to still be able to go back and view the output.) I was thinking of doing something like this: ``` class stream_compose : public streambuf, private boost::noncopyable { public: // take two streams, save them in stream_holder, // this set their buffers to `this`. stream_compose; // implement the streambuf interface, routing to both // ... private: // saves the streambuf of an ios class, // upon destruction restores it, provides // accessor to saved stream class stream_holder; stream_holder mStreamA; stream_holder mStreamB; }; ``` Which seems straight-forward enough. The call in main then would be something like: ``` // anything that goes to cout goes to both cout and the file stream_compose coutToFile(std::cout, theFile); // and so on ``` I also looked at `boost::iostreams`, but didn't see anything related. Are there any other better/simpler ways to accomplish this?

Original source

Related problems