如何创建流对象的集合

时间:2013-04-10 11:14:52

标签: c++ iostream

大多数人都知道不可能拥有standard collection of references。也无法复制流对象。

但是如果我想创建一个流对象或流对象引用的集合(例如std::vector)呢?

我知道我可以将流对象引用包装在例如一个结构,但是你需要实现完整的接口(如果你想直接使用包装器作为流,我更喜欢),或者使用公共getter函数并在任何地方使用它来获取实际的流。

有更简单的方法吗? C ++ 11解决方案没问题。

2 个答案:

答案 0 :(得分:7)

您不能拥有引用容器,但可以拥有std::reference_wrapper容器。也许你想要这样的东西:

std::vector<std::reference_wrapper<stream_type>> v;

您可以将std::reference_wrapper视为非常类似于引用(事实上,它可以隐式转换为引用类型),但它具有作为对象类型的额外优势。

答案 1 :(得分:0)

您可以在集合中使用不可复制的对象:

// this uses move constructors
std::vector<std::fstream> v {std::fstream{"file1.txt"}, std::fstream{"file2.txt"}};

// this doesn't require the type to even be movable
v.emplace_back("file3.txt");

虽然以这种方式避免使用指针和类似引用的类型,但只有在不需要将流用作多态对象时才会起作用。