我正在研究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();
}
这种模式在 boost 中也可见。我们正在尝试确定这是否是值得遵循的模式。有人担心它涉及为字符串流包含一个额外的标头,并且在字符串流中需要额外的堆分配,这可能会被避免。
最合理的建议是,如果客户端需要该功能,那么他们可以创建字符串流并自己进行预传递。
谁能帮我理解为什么这会被认为是好的做法以及我是否应该采用它?