Puede crear otra envoltura alrededor del búfer 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"
}
En una función:
void print(std::ostream& os) {
std::ostream copy (os.rdbuf());
copy << std::hex;
copy << 123;
}
Por supuesto, si el rendimiento es un problema, esto es un poco más caro porque copia todo el ios
objeto (pero no el búfer), incluidas algunas cosas por las que está pagando pero que es poco probable que use, como la configuración regional.
De lo contrario, siento que si vas a usar .flags()
es mejor ser coherente y usar .setf()
también en lugar de la <<
sintaxis (pura cuestión de estilo).
void print(std::ostream& os) {
std::ios::fmtflags os_flags (os.flags());
os.setf(std::ios::hex);
os << 123;
os.flags(os_flags);
}
Como han dicho otros, puede poner lo anterior (y .precision()
y .fill()
, pero normalmente no las cosas relacionadas con la configuración regional y las palabras que generalmente no se van a modificar y son más pesadas) en una clase por conveniencia y para que sea seguro para excepciones; el constructor debería aceptar std::ios&
.