2013-07-26 52 views
1

有沒有簡單的方法來檢查stl :: ostream中是否有序列化內容。我正在尋找類似於:檢查std :: ostream中是否有內容被序列化

some preparation 

// ... a very complex code that may result in adding or not to the stream, 
// that I will prefer not to change 

check if the stream has something added 

請注意,這將需要遞歸地工作。使用register_callback是個好主意還是有更簡單的方法?

回答

0

您是將流傳入複雜代碼還是全局可見?它可以是任何種類的ostream,或者您可以將類型限制爲ofstreamostringstream

如果您的ostream類型支持它(例如大多數fstream s),您可能可以使用tellp來確定自準備代碼以來文件位置是否已更改。或者,如果您要傳入流,則可以傳遞一個空的ostringstream並檢查字符串被提取出來以便打印出來時不爲空。

如果不知道更多關於代碼的上下文和問題的具體信息,哪種解決方案(如果有的話)適合您並不完全清楚。最好的答案可能是返回(或設置爲引用超出參數)表示是否插入了流的標誌。

+0

它可以是任何ostream實現 - 這是重點 – gsf

3

一是直接的問題:register_callback()旨在應對適當的複製,並存儲在pword()資源的釋放,將有隻有涉及到的操作(即,複製,分配和釋放以及觀察std::locale變化)。所以,不,那根本不會幫助你。

你能做什麼,但是,是創建一個過濾流緩衝區,如果有到流寫入其觀察到的,例如,像這樣:

class changedbuf: std::streambuf { 
    std::streambuf* d_sbuf; 
    bool   d_changed; 
    int_type overflow(int_type c) { 
     if (!traits_type::eq_int_type(c, traits_type::eof())) { 
      this->d_changed = true; 
     } 
     return this->d_sbuf->sputc(c); 
    } 
public: 
    changedbuf(std::streambuf* sbuf): d_sbuf(d_sbuf), d_changed() {} 
    bool changed() const { return this->d_changed; } 
} 

您可以在地方使用std::ostream你已經有了,例如:

void f(std::ostream& out) { 
    changedbuf changedbuf(out.rdbuf()); 
    std::ostream changedout(&changedbuf); 
    // use changedout instead of out; if you need to use a global objects, you'd 
    // replace/restore the used stream buffer using the version of rdbuf() taking 
    // an argument 
    if (changedbuf.change()) { 
     std::cout << "there was a change\n"; 
    } 
} 

真正的實現實際上提供緩衝和處理適當的沖洗(即覆蓋sync())和序列輸出(即,覆蓋xsputn())。但是,上述版本足以作爲概念驗證。

其他人可能會建議使用std::ostringstream。取決於寫入的數據量,這可能很容易變成性能高峯,尤其是與適當處理緩衝的高級版本changedbuf相比。

相關問題