gpt4 book ai didi

c++ - 实现可被接受为 std::ostringstream 引用的无操作 std::ostringstream

转载 作者:行者123 更新时间:2023-11-27 23:59:42 26 4
gpt4 key购买 nike

任何人都可以建议一种方法来拥有一个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 & .这里有出路吗?

最佳答案

创建非操作流的最简单方法是实际上不创建自定义流类,而是禁用现有流。例如,您可以通过将其流缓冲区设置为 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 作为参数。相反,任何不构造流的函数都应该按照 std::ostream& 进行传输。如果您现有的接口(interface)已经采用 std::ostringstream,您可以通过从 std::ostringstream 派生并适本地设置流缓冲区来创建空流:

class onullstream
: private virtual nullbuf
, public std::ostringstream {
public:
nullstring()
: std::ios(this)
, std::ostringstgream() {
this->std::ostream::rdbuf(this);
}
};

关于c++ - 实现可被接受为 std::ostringstream 引用的无操作 std::ostringstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40082526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com