如何使用boost::iostreams::null_sink作为std::ostream

How to use boost::iostreams::null_sink as std::ostream

本文关键字:作为 sink std ostream null 何使用 boost iostreams      更新时间:2023-10-16

我想根据运行时给出的标志将输出设置为冗长/非冗长。我的想法是,构造一个依赖于该标志的std::ostream,例如:

std::ostream out;
if (verbose) {
    out = std::cout
else {
    // Redirect stdout to null by using boost's null_sink.
    boost::iostreams::stream_buffer<boost::iostreams::null_sink> null_out{boost::iostreams::null_sink()};
    // Somehow construct a std::ostream from nullout
}

现在我要从这样的boost流缓冲区构造std::ostream。我该怎么做呢?

使用标准库

重置rdbuf:

auto old_buffer = std::cout.rdbuf(nullptr);

否则,只需使用流:

std::ostream nullout(nullptr);
std::ostream& out = verbose? std::cout : nullout;

生活在Coliru

#include <iostream>
int main(int argc, char**) {
    bool verbose = argc>1;
    std::cout << "Running in verbose mode: " << std::boolalpha << verbose << "n";
    std::ostream nullout(nullptr);
    std::ostream& out = verbose? std::cout : nullout;
    out << "Hello worldn";
}

运行./test.exe时:

Running in verbose mode: false

运行./test.exe --verbose时:

Running in verbose mode: true
Hello world

使用Boost Iostreams

如果你坚持的话,你当然可以使用Boost IOstreams:

注意,根据注释,这是严格更好的,因为流不会一直处于"错误"状态。

Live On Coliru

#include <iostream>
#include <boost/iostreams/device/null.hpp>
#include <boost/iostreams/stream.hpp>
int main(int argc, char**) {
    bool verbose = argc>1;
    std::cout << "Running in verbose mode: " << std::boolalpha << verbose << "n";
    boost::iostreams::stream<boost::iostreams::null_sink> nullout { boost::iostreams::null_sink{} };
    std::ostream& out = verbose? std::cout : nullout;
    out << "Hello worldn";
}