Bạn có thể tạo một trình bao bọc khác xung quanh bộ đệm 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"
}
Trong một hàm:
void print(std::ostream& os) {
std::ostream copy (os.rdbuf());
copy << std::hex;
copy << 123;
}
Tất nhiên nếu hiệu suất là một vấn đề, điều này sẽ đắt hơn một chút vì nó sao chép toàn bộ ios
đối tượng (nhưng không phải bộ đệm) bao gồm một số thứ mà bạn đang trả tiền nhưng không có khả năng sử dụng như ngôn ngữ.
Nếu không, tôi cảm thấy nếu bạn định sử dụng .flags()
thì tốt hơn là nên nhất quán và sử dụng .setf()
tốt hơn là <<
cú pháp (câu hỏi thuần túy về phong cách).
void print(std::ostream& os) {
std::ios::fmtflags os_flags (os.flags());
os.setf(std::ios::hex);
os << 123;
os.flags(os_flags);
}
Như những người khác đã nói, bạn có thể đặt những thứ ở trên (và .precision()
và .fill()
, nhưng thường không phải là ngôn ngữ và những thứ liên quan đến từ thường sẽ không được sửa đổi và nặng hơn) trong một lớp để thuận tiện và an toàn cho ngoại lệ; hàm tạo nên chấp nhận std::ios&
.