任何人都可以建议使用 null std::ostringstream
来避免对使用<<
传递给它的参数进行任何处理吗?
这里有两个相关的帖子Implementing a no-op std::ostream和Printing to nowhere with ostream,到目前为止最有希望的解决方案是https://stackoverflow.com/a/760353/826203,但在测试时
int main() {
onullstream os;
os << 666;
// std::ostringstream & oss = os; // error C2440: 'initializing' : cannot convert from 'onullstream' to 'std::ostringstream &'
oss << "hello, world";
}
但是,这只能像os<<666
一样使用,但不能可以用作std::ostringstream &
。在这里任何出路?
答案 0 :(得分:3)
创建非操作流的最简单方法是实际上不创建自定义流类,而是禁用现有流。例如,您可以通过将其流缓冲区设置为null来禁用格式std::ostream
:
std::ostringstream out;
out.std::ostream::rdbuf(0);
// any attempt to write anything to out will fail.
如果您需要一个成功无法格式化数据的流,您可以创建一个不存储任何字节且始终成功的流缓冲区。但是,使用此流缓冲区时,将执行实际格式化:
struct nullbuf: std::streambuf {
std::streambuf::int_type overflow(std::streambuf::int_type c) {
return std::char_traits<char>::not_eof(c);
}
};
// ...
nullbuf buf;
std::ostringstream out;
out.std::ostream::rdbuf(&buf);
请注意,我还建议不让函数以std::ostringstream
作为参数。相反,任何不构造流的函数都应该以{{1}}的方式传播。如果现有接口已经采用std::ostream&
,则可以通过从std::ostringstream
派生并适当设置流缓冲区来创建空流:
std::ostringstream