实现一个可以接受为std :: ostringstream引用的无操作std :: ostringstream

时间:2016-10-17 09:15:17

标签: c++ reference stream

任何人都可以建议使用 null std::ostringstream来避免对使用<<传递给它的参数进行任何处理吗?

这里有两个相关的帖子Implementing a no-op std::ostreamPrinting 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 &。在这里任何出路?

1 个答案:

答案 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