【问题标题】:C++ stream polymorphy on stack?堆栈上的C ++流多态性?
【发布时间】:2023-03-12 23:40:01
【问题描述】:

我想做这样的事情:

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

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

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

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

【问题讨论】:

  • 您可以使用诸如 auto_ptr 之类的智能指针来自动处理分配/解除分配,当然这取决于您以后对变量的使用。
  • 为什么会有人想要这样做?
  • @Alexandre C.:因为通常我希望它可以处理文件,但为了测试,我还想在命令行中快速指定一些文件内容示例。

标签: c++ stl stream polymorphism istream


【解决方案1】:

您可以将与std::wistream& input 一起工作的逻辑抽象为一个自己的函数,然后根据需要使用std::wifstreamstd::wistringstream 调用它。

【讨论】:

    【解决方案2】:

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

    没办法。

    由于复制分配是disabled for all stream classes in C++,所以你不能使用它。这立即意味着你想要的东西是不可能的。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-01-11
          • 2013-02-11
          • 2014-12-14
          • 2012-04-23
          • 1970-01-01
          • 2018-06-06
          • 1970-01-01
          相关资源
          最近更新 更多