Перемещение std :: istream - PullRequest
       85

Перемещение std :: istream

0 голосов
/ 01 апреля 2020

У меня есть класс Scanner для токенизации потоков символов, поступающих из файлов, cin, et c.

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& и надеются на лучшее?

1 Ответ

1 голос
/ 01 апреля 2020

Из того, что я помню о моей работе с потоковыми объектами.

Вы должны подумать об этом немного по-другому.

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

Ваш класс Scanner может быть просто сфокусирован на сканировании ввод для чего угодно, фактически не содержащий его.

Теперь он может быть сфокусирован исключительно на одной задаче.

Затем вам нужно решить, как лучше всего сохранить объект потока. живой. Я предлагаю отдельный класс для этой задачи.

Я бы написал это как комментарий, но здесь слишком много.

...