J'écris une librairie de combinateur d'analyseur généralisée simple. Cela signifie que la bibliothèque contient de nombreux petits objets de fonction, appelée parseurs, qui (lorsqu'il est appelé) prennent une chaîne en entrée et renvoie une liste de ParseResults en sortie, où un ParseResult estC++: travailler avec plusieurs copies de std :: cin?
template <typename A> using ParseResult = std::pair<A, std::string>
La liste est vide si l'analyseur a ne correspond pas, contient un seul résultat s'il correspond, et certains analyseurs qui peuvent correspondre de plusieurs façons (ambiguës) peuvent renvoyer plus de résultats. Cependant, cela signifie que tout un tas de copie de chaîne est actuellement en cours. En outre, au début, l'analyseur finalement construit doit être appelé avec une chaîne, ainsi tous les std::cin
(ou le contenu coompété d'un fichier) sont copiés dans une chaîne. Ce qui semble être une meilleure idée (puisque les parseurs ne regardent que le ou les premiers caractères de l'avant de la chaîne), est de garder une trace de l'endroit où vous êtes en ce moment dans l'entrée standard courant. Et je crois que c'est exactement ce qu'est un std::istream
. Cependant, les istreams ne sont pas copiables. Comment mon problème peut-il être résolu? Existe-t-il un moyen de renvoyer une copie d'un istream qui pointe vers quelques caractères vers où pointe l'original? Ou y a-t-il une autre façon plus propre de résoudre ce problème?
Savez-vous quelles références sont en C++? – PiotrNycz