C++堆栈上的流多态性?

发布于 2024-12-07 13:40:04 字数 381 浏览 0 评论 0原文

我想做这样的事情:

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

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

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

还有另一种方法可以在堆栈上执行此操作吗?

I would like to do something like this:

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

i.e. have text either interpreted as a filename, or, if no such file exists, use its contents instead of the file's contents.

I could of course use std::wistream * input and then new and delete for the actual streams. But then, I would have to encapsulate all of this in a class (constructor and destructor, i.e. proper RAII for exception safety).

Is there another way of doing this on the stack?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

自找没趣 2024-12-14 13:40:04

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

You could abstract the logic that works with std::wistream& input into a function of its own, and then call it with a std::wifstream or std::wistringstream as appropiate.

月光色 2024-12-14 13:40:04

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

这就是 std::unique_ptr 的用途。只需使用 std::unique_ptr 即可。

I could of course use std::wistream * input and then new and delete for the actual streams. But then, I would have to encapsulate all of this in a class (constructor and destructor, i.e. proper RAII for exception safety).

This is what std::unique_ptr is for. Just use std::unique_ptr<std::istream>.

雪若未夕 2024-12-14 13:40:04

还有其他方法可以在堆栈上执行此操作吗?

决不。

由于复制分配对 C++ 中的所有流类禁用,你不能使用它。这立即意味着你想要的东西是不可能的。

Is there another way of doing this on the stack?

No way.

As the copy-assignment is disabled for all stream classes in C++, you cannot use it.That immediately implies that what you want is not possible.

爱*していゐ 2024-12-14 13:40:04

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

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

Have you considered auto_ptr or unique_ptr to manage the wistream pointer?

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文