我想編寫一個簡單的ostream
,其中包含一個參數ostream
,並在將其傳遞給參數流之前以某種方式更改流。這種轉換很簡單,就像改變一個字母或擦除一個字編寫一個ostream過濾器?
從ostream
繼承的簡單類會是什麼樣子?我應該覆蓋哪些方法?
我想編寫一個簡單的ostream
,其中包含一個參數ostream
,並在將其傳遞給參數流之前以某種方式更改流。這種轉換很簡單,就像改變一個字母或擦除一個字編寫一個ostream過濾器?
從ostream
繼承的簡單類會是什麼樣子?我應該覆蓋哪些方法?
std::ostream
不是實現過濾的最佳位置。它沒有適當的虛擬功能讓你這樣做。
你可能想要寫含有包裹std::ostream
(或包裹std::streambuf
),然後使用該std::streambuf
創建std::ostream
從std::streambuf
派生的類。
std::streambuf
有一個虛擬函數overflow
,您可以重寫並使用它來在將字節傳遞給包裝的輸出類之前更改字節。
我一直認爲編寫專門的流是幾乎任何問題的錯誤方法。輸出流通常是程序中的一個終點 - 任何數據處理都應該在到達流本身之前完成。對於輸入流也是如此 - 將所需的智能(比如說)解析輸入到流中是把它放在錯誤的地方。當然,我的2美分。
考慮使用Boost.Iostreams
當然。它可能是插入諸如壓縮或加密之類的字節過濾器的明智之處(將這些功能透明地添加到已經序列化爲ostream的代碼中),但它可能不是正確的操作結構化數據的地方。 – 2010-04-25 10:49:45