首页 > 解决方案 > 移动 std::istream

问题描述

我有一个Scanner类来标记来自文件cin等的字符流。

class Scanner {
public:
  Scanner(std::istream&& c) : input{std::move(c)} {}

private:
  std::istream input;
};

此代码无法编译,因为 的移动构造函数std::istream受到保护。我可以使用对流的引用,但是,我不能保证有人没有在Scanner课堂之外玩我的流(ss如下)。

  std::string code = "this is code";
  std::stringstream ss{code};
  Scanner scanner{ss};

有没有一种巧妙的方法来解决这个问题,还是人们只是使用std::istream&并希望得到最好的结果?

标签: c++movefstreamiostreamistream

解决方案


根据我对流对象工作的记忆。

您需要以不同的方式考虑这一点。

class Scanner {
public:
  Scanner() {}
  virtual void scan(std::istream & p_stream);
};

您的 Scanner 类可以只专注于扫描输入以查找任何内容,而不是实际包含它。

现在它可以只专注于一项任务。

然后,您需要找出让流对象保持活动状态的最佳方法。我建议为该任务开设一个单独的课程。

我会写这个作为评论,但是这里太多了。


推荐阅读