假设我有一个函数,它使用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/

10-11 22:43
查看更多