2011-10-01 145 views
0

我願做這樣的事情:堆棧上的C++ stream polymorphy?

std::wistream input = std::wifstream(text); 
if (!input) input = std::wistringstream(text); 
// read from input 

即有文字或者解釋爲一個文件名,或者,如果沒有這樣的文件,使用它的內容,而不是文件的內容。

我當然可以使用std::wistream * input,然後newdelete作爲實際的流。但是,我必須將所有這些封裝在一個類中(構造函數和析構函數,即適當的RAII,以實現異常安全性)。

是否有另一種方法在堆棧上做到這一點?

+0

您可以使用智能指針(如auto_ptr)自動處理分配/釋放,具體取決於您以後使用該變量。 – DeCaf

+0

爲什麼在地球上會有人想要這樣做? –

+0

@Alexandre C .:因爲我通常希望它能夠處理文件,但是爲了測試,我還想在命令行中快速指定一些文件內容示例。 –

回答

2

您可以將與std::wistream& input一起使用的邏輯抽象爲其自己的函數,然後根據情況使用std::wifstreamstd::wistringstream進行調用。

2

我當然可以使用std ::的* wistream輸入,然後new和delete的實際流。但是,我必須將所有這些封裝在一個類中(構造函數和析構函數,即適當的RAII,以實現異常安全性)。

這是std::unique_ptr的用途。只需使用std::unique_ptr<std::istream>