Вы можете создать еще одну оболочку вокруг буфера 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&
.