gpt4 book ai didi

c++ - 在 ostream 函数中使用 stringstream

转载 作者:可可西里 更新时间:2023-11-01 17:37:12 26 4
gpt4 key购买 nike

我正在考虑为某些数学类(矩阵、 vector 等)提供 ostream 运算符。一位 friend 注意到 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 中也是可见的。我们正在尝试确定这是否是一个值得遵循的模式。有人担心它涉及为字符串流包含一个额外的 header ,并且字符串流中需要额外的堆分配,这可能是可以避免的。

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

谁能帮助我理解为什么这会被视为良好做法以及我是否应该采用它?

最佳答案

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

std::complex i(0, 1);
std::cout << std::setw(10) << std::left << i;

这应该打印 "(0,1) " 而不是 "( 0,1)"

通过将整个输出形成为单个字符串,然后将其写出,输出遵循流中设置的字段宽度和其他格式标志。

关于c++ - 在 ostream 函数中使用 stringstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12904155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com