假设我有一个函数,它接受一个ostream &
参数o
并写入该 ostream。一个operator <<
实现将是一个很好的例子。
ostream& operator << (ostream& o, const MyThing& t)
{
// ... interesting code here ...
return o;
}
在函数中,我可能想在流上指定格式选项。例如,我可能希望将一个数字打印为十六进制,无论o
它在传递给函数时是如何配置的。
其次,我可能希望能够对当前的格式化标志做出假设。例如,除非我另有要求,否则能够假设数字被格式化为十进制会很好。
最后,当函数退出时,我希望格式化选项o
与调用函数之前的格式选项相同,以便对调用者保持不变。这只是对呼叫者的礼貌问题。
到目前为止,我已经通过ostringstream
在函数中创建一个 local 来实现这一点,完成我所有的工作(包括设置格式选项),并在函数末尾 发送.str()
to 。这里的 StackOverflow 问题表明比我聪明的人也采用相同的方法。 但是,让我感到困扰的是,我在 ostringstreams 中保留了这么多数据,这些数据可能会更早地发送到输出(字符串可能会变得非常大)。o
我有两个问题:
1)创建一个临时的(基于堆栈的)ostream并在该ostream 上做我的工作是否合法、惯用、良好的形式等?o.rdbuf()
我自己的测试和cppreference.com上的页面似乎表明我可以。
ostream& operator << (ostream& o_, const MyThing& t)
{
ostream o (o_.rdbuf());
// write stuff to "o",
// setting formatting options as I go.
return o_; // Formatting on the parameter ostream o_ unchanged.
}
2)我没有考虑过另一种更好的方法吗?