Поскольку в C ++ нет встроенных средств отражения и постоянства, вы не можете написать функцию, которая читает любой объект и затем видит, что он придумал. Вы должны заранее знать, что вы ищете и прочитать это специально. (Конечно, вы всегда можете просто прочитать токены и передать их в парсер.)
Если вы точно знаете, какой тип объекта следует читать из потока, часто полезно дать этому классу конструктор, принимающий std::istream&
. Поскольку обычно в классе также находится код для записи в поток, это сближает их обоих, что лучше всего подходит для обслуживания. Код синтаксического анализа затем просто создает объект, передающий поток конструктору.
Если вы не знаете, с каким типом вы столкнетесь, вам придется написать (возможно, простую) функцию синтаксического анализа. Такие форматы должны начинаться с идентификатора, который сообщает, какой тип объектов следует. Ваша функция синтаксического анализа должна сначала прочитать этот идентификатор, а затем перейти к коду, который читает соответствующий тип из потока. Поскольку в этот момент он знает, какой тип объекта следует читать из потока, чтение реальных объектов может быть реализовано в конструкторах, как описано выше.