Ich schreibe eine einfache verallgemeinerte Parser-Kombinator-Bibliothek. Dies bedeutet, dass die Bibliothek viele kleine Funktionsobjekte, die so genannte Parser enthält, die einen String als Eingabe (wenn genannt) nehmen und eine Liste der ParseResults als Ausgabe zurück, wo ein parseResult istC++: Arbeiten mit mehreren Kopien von Std :: Cin?
template <typename A> using ParseResult = std::pair<A, std::string>
Die Liste ist leer, wenn der Parser tut stimmt nicht überein, enthält ein einzelnes Ergebnis, wenn es übereinstimmt, und bestimmte Parser, die mehrere (mehrdeutige) Übereinstimmungen aufweisen, geben möglicherweise mehr Ergebnisse zurück.
Dies bedeutet jedoch, dass gerade jetzt eine ganze Reihe von String-Kopieren läuft. Zu Beginn muss der schließlich konstruierte Parser mit einer Zeichenkette aufgerufen werden, so dass alle std::cin
(oder der Coompete-Inhalt einer Datei) in eine Zeichenkette kopiert werden.
Was scheint eine bessere Idee zu sein (da die Parser immer nur die ersten (wenigen) Zeichen an der aktuellen Vorderseite der Zeichenkette betrachten), ist es wichtig zu wissen, wo Sie sich gerade in der Standardeingabe befinden Strom. Und ich glaube das ist genau das, was ein std::istream
ist. Ireams sind jedoch nicht kopierbar. Wie kann mein Problem gelöst werden? Gibt es eine Möglichkeit, eine Kopie eines iStreams zurückzugeben, der auf ein paar Zeichen hinweist, wo das Original liegt? Oder gibt es einen anderen, saubereren Weg, dieses Problem zu lösen?
Wissen Sie, welche Referenzen in C++ sind? – PiotrNycz