您可以在stdout缓冲区周围创建另一个包装器:
#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"
}
在函数中:
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());
os.setf(std::ios::hex);
os << 123;
os.flags(os_flags);
}
正如其他人所说,您可以将上述内容(和.precision()
和.fill()
,但通常不带与语言环境和单词相关的东西,通常不会对其进行修改且较重)放在一个类中,以方便使用并使其变得异常安全;构造函数应该接受std::ios&
。