假设我有一个函数,它使用ostream &
参数o
并将其写入该ostream。 operator <<
实现将是一个很好的例子。
ostream& operator << (ostream& o, const MyThing& t)
{
// ... interesting code here ...
return o;
}
在函数中,我可能想在流上指定格式选项。例如,无论将
o
传递给函数时如何配置,我都可能希望将其打印为十六进制数字。其次,我可能希望能够对当前的格式设置标志做出假设。例如,除非我另有要求,否则能够假定数字被格式化为十进制会很好。
最后,在函数退出时,我希望
o
上的格式设置选项与调用该函数之前的格式选项相同,以便对调用方不显示任何更改。这只是调用者的礼貌问题。到目前为止,我已经通过在函数内创建本地
ostringstream
,完成所有工作(包括设置格式选项)并将函数的结尾处的.str()
发送到o
来实现此目的。 StackOverflow问题here建议比我聪明的人采用相同的方法。 但是,令我感到困扰的是,我在ostringstream中保存了太多数据,这些数据可能会更早地发送到输出(字符串可能会变得很大)。我有两个问题:
1)在
o.rdbuf()
周围创建一个临时的(基于堆栈的)ostream,并在该ostream上做我的工作,是否合法,惯用,良好形式等?我自己的测试以及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)还有我没有考虑过的另一种更好的方法吗?
最佳答案
Boost IO State Savers正是为此目的而构建的。
关于c++ - 我应该使用其他人的streambuf创建一个临时的ostream吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26778729/