堆栈上的C++流多态性

C++ stream polymorphy on stack?

本文关键字:多态性 C++ 堆栈      更新时间:2023-10-16

我想做这样的事情:

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

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

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

在堆栈上还有其他方法吗?

您可以将使用std::wistream& input的逻辑抽象为自己的函数,然后使用std::wifstreamstd::wistringstream调用它。

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

这就是std::unique_ptr的作用。只需使用std::unique_ptr<std::istream>

在堆栈上还有其他方法吗?

不可能。

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

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

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