2011-10-01 143 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>