Ви можете створити іншу обгортку навколо буфера 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&
.