C++ 流格式化有两种方式:成员函数和操纵算子,两种等效。类似C的 printf。成员函数进行流格式化操作有些冗长乏味。
操纵算子又分有参和无参两种。无参定义在《iostream>,有参定义在<iomanip>中。
istringstream is("one 2.34 five");
string temp;
is >> setw(2) >> temp;
assert(temp == "on");
is >> setw(2) >> temp;
assert(temp == "e");
double x;
is >> setw(2) >> x;
double relerr = fabs(x - 2.34) / x;
assert(relerr <= numeric_limits<double>::epsilon());
如上代码使用了有参的setw操纵算子。
setw 产生函数的调用地址,编译时应用算子会调用这些函数,并传递ostream对象做为自己的参数,
template<typename _CharT, typename _Traits>
inline basic_istream<_CharT, _Traits>&
operator>>(basic_istream<_CharT, _Traits>& __is, _Setw __f)
{
__is.width(__f._M_n);
return __is;
}