Anda dapat membuat pembungkus lain di sekitar buffer 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"
}
Dalam sebuah fungsi:
void print(std::ostream& os) {
std::ostream copy (os.rdbuf());
copy << std::hex;
copy << 123;
}
Tentu saja jika kinerja menjadi masalah, ini sedikit lebih mahal karena menyalin seluruh ios
objek (tetapi bukan buffer) termasuk beberapa hal yang Anda bayar tetapi tidak mungkin digunakan seperti lokal.
Kalau tidak, saya merasa jika Anda akan menggunakannya .flags()
lebih baik untuk konsisten dan menggunakan .setf()
juga daripada <<
sintaks (pertanyaan murni tentang gaya).
void print(std::ostream& os) {
std::ios::fmtflags os_flags (os.flags());
os.setf(std::ios::hex);
os << 123;
os.flags(os_flags);
}
Seperti yang dikatakan orang lain, Anda dapat meletakkan hal-hal di atas (dan .precision()
dan .fill()
, tetapi biasanya bukan lokal dan hal-hal yang berhubungan dengan kata-kata yang biasanya tidak akan dimodifikasi dan lebih berat) di dalam kelas untuk kenyamanan dan membuatnya aman untuk pengecualian; konstruktor harus menerima std::ios&
.