2015-07-10 43 views
1

我已經定義了一個名爲ZipFileDevice的提升設備,它接收一個存檔路徑以及該存檔內文件的路徑。如何處理打開和關閉boost iostreams設備?

該設備定義讀取,寫入,尋找,採取兩個路徑和析構函數的構造函數。

我打開ZipFileDevice的構造函數中的zip文件,並在析構函數中關閉它。

這是我如何使用設備:

boost::iostreams::stream_buffer<ZipFileDevice> kBuff("path/to/archive", "path/to/file"); 
std::iostream kStream(&kBuff); 
kStream.read(...); 

我的問題是,ZipFileDevice是創建stream_buffer時複製兩次,並且副本被破壞,關閉zip文件。當我從流中讀取時,文件已關閉。

如何正確處理打開和關閉設備?

回答

0

design rationale page

過濾器和設備必須是CopyConstructible或使用boost::ref被傳遞到流和流緩衝。

此要求可能會變得複雜過濾器和設備的設計,因爲一些組件,否則會是不可複製的必須使用引用計數

模板basic_file是一個很好的例子。 Boost.Iostreams的預發佈版本允許將動態分配的過濾器和設備作爲指針傳遞給流和流緩衝區,這些指針將由用戶選擇成爲Iostreams庫的擁有者。這種設計被拒絕的原因有兩個:它不是特例安全的,它需要一個額外的函數參數來指示一個對象是否被庫所擁有。

因此,要麼將boost::ref傳遞到您的設備,要麼執行Handle/Body成語例如在Device中輸入shared_ptr<DeviceImpl>