C++堆栈上的流多态性?
我想做这样的事情:
std::wistream input = std::wifstream(text);
if (!input) input = std::wistringstream(text);
// read from input
即将文本解释为文件名,或者,如果不存在这样的文件,则使用其内容而不是文件的内容。
我当然可以使用 std::wistream * input
,然后使用 new
和 delete
来处理实际的流。但是,我必须将所有这些封装在一个类中(构造函数和析构函数,即用于异常安全的适当 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您可以抽象与 std::wistream& 一起使用的逻辑。 input 到它自己的函数中,然后根据需要使用
std::wifstream
或std::wistringstream
调用它。You could abstract the logic that works with
std::wistream& input
into a function of its own, and then call it with astd::wifstream
orstd::wistringstream
as appropiate.这就是 std::unique_ptr 的用途。只需使用
std::unique_ptr
即可。This is what
std::unique_ptr
is for. Just usestd::unique_ptr<std::istream>
.决不。
由于复制分配对 C++ 中的所有流类禁用,你不能使用它。这立即意味着你想要的东西是不可能的。
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.
您是否考虑过使用 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/