Stdout arabelleği etrafında başka bir sarmalayıcı oluşturabilirsiniz:
#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"
}
Bir işlevde:
void print(std::ostream& os) {
std::ostream copy (os.rdbuf());
copy << std::hex;
copy << 123;
}
Elbette, performans bir sorunsa, bu biraz daha pahalıdır, çünkü ios
yerel ayar gibi para ödediğiniz ancak kullanamayacağınız bazı şeyler dahil olmak üzere tüm nesneyi (ancak arabelleği değil) kopyalamaktır .
Aksi takdirde, eğer .flags()
kullanacaksanız .setf()
, <<
sözdizimi yerine tutarlı olmanın ve kullanmanın daha iyi olduğunu düşünüyorum (saf stil sorunu).
void print(std::ostream& os) {
std::ios::fmtflags os_flags (os.flags());
os.setf(std::ios::hex);
os << 123;
os.flags(os_flags);
}
Diğerleri söylediler Yukarıdaki koymak (ve edebilir .precision()
ve .fill()
ancak tipik genellikle modifiye edilecek ve daha ağır değildir değil yerel ve kelimeler alakalı şeyler) bir sınıfta kolaylık ve özel durum korumalı hale getirmek için; kurucu kabul etmelidir std::ios&
.