如何使用boost::iostreams::null_sink作为std::ostream
How to use boost::iostreams::null_sink as std::ostream
我想根据运行时给出的标志将输出设置为冗长/非冗长。我的想法是,构造一个依赖于该标志的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";
}
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将Ref对象作为类成员
- 虚拟决赛作为安全
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 使用指向成员的指针将成员函数作为参数传递
- 我应该使用什么来代替void作为变体中的替代类型之一
- 何时提供默认参数作为模板参数
- 如何将 I->getType() 作为参数传递给 llvm 中的 CreateCall?
- C++使用数组作为多维数组,尽管将其初始化为带有指针的 1D
- C++匿名结构作为std::映射值
- C++:如何使函数只返回作为列表一部分的字符串
- 如何制作一个将函数作为参数的类方法
- 如何在C++中使用非静态成员函数作为回调函数
- 修改函数中的指针(将另一个指针作为参数传递)
- Clang bug?使用指针作为模板参数
- 函数作为模板参数,是否对返回类型强制约束
- 在C++中传递给函数时,为什么要指定数组大小作为参数
- 为什么 Clang 不允许"and"作为函数名称?
- 如何使用压缩器Boost::Iostreams过滤器作为Boost::Log中的sink