Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建流对象的集合_C++_Iostream - Fatal编程技术网

C++ 如何创建流对象的集合

C++ 如何创建流对象的集合,c++,iostream,C++,Iostream,正如大多数人所知道的那样,不可能有一个。也不可能复制流对象 但是,如果我想创建流对象或流对象引用的集合(例如std::vector),该怎么办 我知道我可以将流对象引用封装在一个结构中,但是你要么需要实现完整的接口(如果你想直接将包装器作为流使用,我更喜欢),要么使用一个公共getter函数并在任何地方使用它来获得实际的流 有没有更简单的方法?C++11解决方案还可以。您不能有一个引用容器,但可以有一个引用容器。也许你想要这样的东西: std::vector<std::reference_

正如大多数人所知道的那样,不可能有一个。也不可能复制流对象

但是,如果我想创建流对象或流对象引用的集合(例如
std::vector
),该怎么办

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


有没有更简单的方法?C++11解决方案还可以。

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

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

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

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

// 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");
//这将使用移动构造函数
std::vector v{std::fstream{“file1.txt”},std::fstream{“file2.txt”};
//这甚至不要求字体可以移动
v、 安放回(“file3.txt”);

尽管只有在不需要将流用作多态对象的情况下,这种方法才能避免指针和类似引用的类型。

为什么不使用指针集合?或者如果需要自动销毁它们,则使用智能指针集合?那么
std::reference\u wrapper
的集合呢?@riv当然可以,但我宁愿不要,除非没有其他办法。@juanchopanza我想你用这个就击中了目标。刚刚测试过,效果很好。如果直接在输出或输入操作中使用,但在传递给其他函数时,仍必须使用
get
函数来获取引用流。我可以接受。