就可以围绕标准输出缓冲区中的另一包装:
#include <iostream>
#include <iomanip>
int main() {
int x = 76;
std::ostream hexcout (std::cout.rdbuf());
hexcout << std::hex;
std::cout << x << "\n"; // still "76"
hexcout << x << "\n"; // "4c"
}
在func重刑:
void print(std::ostream& os) {
std::ostream copy (os.rdbuf());
copy << std::hex;
copy << 123;
}
当然,如果性能是一个问题,这是一个有点贵,因为它是复制整个ios
对象(但不包括缓冲区)在内的一些东西,你付出的,但不太可能使用如语言环境。
否则我觉得如果你打算使用.flags()
,最好保持一致并使用.setf()
而不是<<
语法(风格的纯粹问题)。
void print(std::ostream& os) {
std::ios::fmtflags os_flags (os.flags());
std::size_t os_width (os.width());
os.setf(std::ios::hex);
os.width(4);
os << 123;
os.flags(os_flags);
os.width(os_width);
}
正如其他人说你可以把上面的(和.precision()
和.fill()
,但通常没有语言环境和单词相关的东西,通常不会被修改,并且较重)一类为方便和使其异常安全;构造函数应该接受std::ios&
。
我相信十六进制只能用于下一个移出操作。如果您手动更改格式标志而不是使用操纵器,则更改仅保留。 – 2010-02-16 15:39:20
@BillyONeal:不,使用操纵器与手动更改格式标志具有相同的效果。 :-P – 2010-02-16 15:55:45
如果您在此处由于Covertiy发现***不恢复ostream格式(STREAM_FORMAT_STATE)***,请参阅[Coverity finding:Not restoring ostream format(STREAM_FORMAT_STATE)](http://stackoverflow.com/ q/34503914)。 – jww 2016-01-25 21:11:29