Você pode criar outro wrapper em torno do 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"
}
Em uma função:
void print(std::ostream& os) {
std::ostream copy (os.rdbuf());
copy << std::hex;
copy << 123;
}
Claro, se o desempenho for um problema, isso é um pouco mais caro porque está copiando o ios
objeto inteiro (mas não o buffer), incluindo algumas coisas que você está pagando, mas improvável de usar, como o local.
Caso contrário, acho que se você for usar .flags()
, é melhor ser consistente e usar .setf()
também do que a <<
sintaxe (pura questão 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 outros disseram, você pode colocar o acima (e .precision()
e .fill()
, mas normalmente não o local e as coisas relacionadas a palavras que geralmente não serão modificadas e são mais pesadas) em uma classe por conveniência e para torná-la segura para exceções; o construtor deve aceitar std::ios&
.