0

我想做这样的事情:

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

即,将文本解释为文件名,或者,如果不存在这样的文件,则使用其内容而不是文件的内容。

我当然可以使用std::wistream * inputand then newanddelete来处理实际的流。但是,我必须将所有这些封装在一个类中(构造函数和析构函数,即用于异常安全的适当 RAII)。

在堆栈上还有另一种方法吗?

4

4 回答 4

2

您可以将与之一起工作的逻辑抽象std::wistream& input为它自己的函数,然后用 astd::wifstreamstd::wistringstream适当地调用它。

于 2011-10-01T18:00:11.333 回答
2

我当然可以使用 std::wistream * 输入,然后为实际的流使用 new 和 delete。但是,我必须将所有这些封装在一个类中(构造函数和析构函数,即用于异常安全的适当 RAII)。

这是std::unique_ptr为了什么。只需使用std::unique_ptr<std::istream>.

于 2011-10-01T18:09:10.787 回答
1

在堆栈上还有另一种方法吗?

没门。

由于C++ 中的所有流类都禁用了复制分配,因此您无法使用它。这立即意味着您想要的东西是不可能的。

于 2011-10-01T18:01:00.320 回答
1

您是否考虑过 auto_ptr 或 unique_ptr 来管理 wistream 指针?

http://www.cplusplus.com/reference/std/memory/auto_ptr/

于 2011-10-01T18:04:50.223 回答