我有一段時間的模板包裝C庫FILE *。這是一個相當經典的FILE *包裝類的共享指針實現。使用我自己的自定義共享指針的原因是爲某些C庫FILE *免費函數提供了免費函數替換,以便允許我替代使用FILE *的舊代碼。需要幫助解決運行時多態性使用模板
,我有實現使用的內包裝材料,保證當它被刪除,所擁有的FILE *關閉。 RAII。
但是,我需要創建一個類似的系統來處理這種情況,我希望底層的FILE *被沖刷掉,而不是在最後一個FILE *持有者被銷燬時關閉。也就是說,我有一個原始保證關閉類型的FILE *,但希望將FILE *的一個無主副本分發給另一個對象,該對象將保證當最後一個實例被銷燬時,它會刷新&截斷FILE *而不是關閉它,因此我將底層FILE *留在打開狀態,但將流的內容刷新到磁盤(並且文件大小僅反映有效內容)。
我已經爲編譯時多態性解決了這個問題。但我需要一些方法來提供運行時多態性,而且我真的不想在這種情況下放置另一層間接指向(即,如果我使用多態指針指向自動關閉或自動刷新文件*包裝,我會是金 - 但我真的想保持現在的深度,並隱藏定製共享指針實現中的多態性)。
基本上,如果我有一個:
template <class WrapperT>
class FilePointerT
{
public:
// omitted: create, destroy, manipulate the underlying wrappered FILE*
private:
WrapperT * m_pFileWrapper;
ReferenceCount m_rc;
}
顯然,噸細節省略。只要說這些對象中的最後一個被刪除,它就會刪除最後一個m_pFileWrapper(實際上,如果我正在重寫這段代碼,我可能會使用boost :: shared_ptr)。
無論如何,這裏真正的問題是我如何擁有一個FilePointerT WrapperT >其WrapperT可以改變,但可以在代碼中使用,就好像它們都是一樣的(畢竟,它們是由於WrapperT實施具有零上FilePointerT的結構和接口(本質上是平普爾)的影響。
我能聲明都不可能持有任何FilePointerT <WrapperT>任何WrapperT?
或者說,如何我可以更改FilePointerT的定義以便允許我提供特定的WrapperT嗎?
尋找此解決方案...... – Mordachai 2012-03-28 14:29:40