Sie können einen weiteren Wrapper um den Standardpuffer erstellen:
#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"
}
In einer Funktion:
void print(std::ostream& os) {
std::ostream copy (os.rdbuf());
copy << std::hex;
copy << 123;
}
Wenn die Leistung ein Problem darstellt, ist dies natürlich etwas teurer, da das gesamte ios
Objekt (aber nicht der Puffer) kopiert wird, einschließlich einiger Dinge, für die Sie bezahlen, die Sie jedoch wahrscheinlich nicht verwenden werden, wie z. B. das Gebietsschema.
Ansonsten denke ich, wenn Sie es verwenden wollen, ist .flags()
es besser, konsistent zu sein und es auch zu verwenden, .setf()
als die <<
Syntax (reine Frage des Stils).
void print(std::ostream& os) {
std::ios::fmtflags os_flags (os.flags());
os.setf(std::ios::hex);
os << 123;
os.flags(os_flags);
}
Wie andere gesagt haben, können Sie die oben genannten (und .precision()
und .fill()
, aber normalerweise nicht das Gebietsschema und wortbezogene Dinge, die normalerweise nicht geändert werden und schwerer sind) in eine Klasse einordnen, um sie zu vereinfachen und ausnahmsicher zu machen. Der Konstruktor sollte akzeptieren std::ios&
.