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()
and .fill()
、ただし通常は変更されず、より重いロケールおよび単語に関連するものではない)を便宜上、例外に安全にするためにクラスに入れることができます。コンストラクタは受け入れる必要がありますstd::ios&
ます。