Giả sử tôi có một hàm có tham số ostream &
o
và ghi vào luồng đó. Việc thực hiện operator <<
sẽ là một ví dụ tốt.Tôi có nên tạo một đoạn phim tạm thời bằng cách sử dụng streambuf của người khác không?
ostream& operator << (ostream& o, const MyThing& t)
{
// ... interesting code here ...
return o;
}
Trong hàm, tôi có thể muốn chỉ định tùy chọn định dạng trên luồng. Ví dụ, tôi có thể muốn một số được in dưới dạng hex, bất kể cách o
được định cấu hình khi nó được truyền vào hàm.
Thứ hai, tôi có thể muốn có thể đưa ra các giả định về các cờ định dạng hiện tại. Ví dụ, nó sẽ là tốt đẹp để có thể giả định rằng các con số đã được định dạng như số thập phân, trừ khi tôi yêu cầu khác.
Cuối cùng, khi chức năng thoát tôi muốn các tùy chọn định dạng trên o
giống như trước khi hàm được gọi, để xuất hiện không thay đổi đối với người gọi. Đây chỉ đơn giản là vấn đề lịch sự với người gọi. Cho đến bây giờ tôi đã đạt được điều này bằng cách tạo ra một địa phương ostringstream
trong chức năng, làm tất cả công việc của tôi trên đó (bao gồm các tùy chọn định dạng cài đặt), và gửi .str()
đến o
ở cuối hàm. Câu hỏi StackOverflow here cho thấy rằng những người thông minh hơn tôi có cùng một cách tiếp cận. Tuy nhiên, nó làm phiền tôi rằng tôi đang giữ rất nhiều dữ liệu trong ostringstreams có lẽ có thể được gửi đến đầu ra trước đó (các chuỗi có thể nhận được khá lớn).
Tôi có hai câu hỏi:
1) Có quy phạm pháp luật, thành ngữ, hình thức tốt, , vv để tạo ra một tạm thời ngăn xếp dựa) ostream (khoảng o.rdbuf()
và làm công việc của tôi trên ostream đó? Các thử nghiệm của riêng tôi và trang tại cppreference.com dường như gợi ý rằng tôi có thể.
ostream& operator << (ostream& o_, const MyThing& t)
{
ostream o (o_.rdbuf());
// write stuff to "o",
// setting formatting options as I go.
return o_; // Formatting on the parameter ostream o_ unchanged.
}
2) Có cách nào khác, tốt hơn tôi chưa xem xét?
Những cuộc gọi tốt nhất sẽ được đặt trong constructor và destructor của một số đối tượng dựa trên stack. Tôi cho rằng đó là những gì các lớp Boost làm. – peterpi