我正在编写一个简单的通用解析器组合库。这意味着该库包含许多称为解析器的小函数对象,它们(在调用时)将字符串作为输入并返回 ParseResults 列表作为输出,其中 ParseResult 是
template <typename A>
using ParseResult = std::pair<A, std::string>
如果解析器不匹配,则列表为空,如果匹配则包含单个结果,并且某些可能以多种(不明确)方式匹配的解析器可能会返回更多结果。
但是,这意味着现在正在进行大量的字符串复制。此外,在开始时,最终构造的解析器需要用一个字符串调用,因此所有std::cin
(或文件的竞争内容)都被复制到一个字符串中。
似乎更好的主意(因为解析器只查看字符串当前前面的第一个(几个)字符),是跟踪您现在在标准输入流中的位置。我相信这正是 astd::istream
的样子。但是,istream 是不可复制的。如何解决我的问题?有没有办法返回一个 istream 的副本,该副本指向原来指向的几个字符?还是有另一种更清洁的方法来解决这个问题?