在ostream函数中使用stringstream

Mic*_*nes 8 c++ ostream

我正在研究ostream为一些数学类(矩阵,向量等)提供运算符.朋友已经注意到ostream运算符的gcc标准库实现std::complex包括在将输出传递给之前将字符串流内部用于格式化输出.实际ostream:

///  Insertion operator for complex values.
template<typename _Tp, typename _CharT, class _Traits>
  basic_ostream<_CharT, _Traits>&
  operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x)
{
  basic_ostringstream<_CharT, _Traits> __s;
  __s.flags(__os.flags());
  __s.imbue(__os.getloc());
  __s.precision(__os.precision());
  __s << '(' << __x.real() << ',' << __x.imag() << ')';
  return __os << __s.str();
}
Run Code Online (Sandbox Code Playgroud)

这种模式在增强中也是可见的.我们正试图确定这是否值得关注.有人担心它涉及为字符串流包含一个额外的头,并且在字符串流中需要额外的堆分配,这可能是可以避免的.

最合理的是,有人建议如果客户端需要该功能,那么他们可以创建字符串流并自己进行预传.

任何人都可以帮助我理解为什么这被认为是良好的做法以及我是否应该采用它?

Jon*_*ely 6

考虑如果在ostream上设置输出宽度然后将std :: complex写入它会发生什么 - 您不希望宽度仅影响第一个输出操作(即'('字符)

std::complex i(0, 1);
std::cout << std::setw(10) << std::left << i;
Run Code Online (Sandbox Code Playgroud)

这应该打印"(0,1)     ""(         0,1)"

通过将整个输出形成为单个字符串,然后将其写出输出,可以考虑字段宽度和流上设置的其他格式标记.