// // scoped_buffer_capture.h // scoped_buffer_capture // // Created by Sam Jaffe on 6/2/18. // #pragma once #include class scoped_buffer_capture_t { public: scoped_buffer_capture_t(std::ostream & stream) : buffer() , sbuf(stream.rdbuf()) , out(&stream) { out->rdbuf(buffer.rdbuf()); } ~scoped_buffer_capture_t() { out->rdbuf(sbuf); } scoped_buffer_capture_t(scoped_buffer_capture_t const &) = delete; scoped_buffer_capture_t & operator=(scoped_buffer_capture_t const &) = delete; scoped_buffer_capture_t(scoped_buffer_capture_t &&) = delete; scoped_buffer_capture_t & operator=(scoped_buffer_capture_t &&) = delete; std::string str() const { return buffer.str(); } private: std::stringstream buffer; std::streambuf * sbuf; std::ostream * out; }; #define capture_stdout() scoped_buffer_capture_t cap_cout(std::cout) #define capture_stderr() scoped_buffer_capture_t cap_cerr(std::cerr)