私は簡単な一般化されたパーサーコンビネータライブラリを書いています。これは、ライブラリが(と呼ばれる)パーサと呼ばれる多くの小さな関数オブジェクトは、入力として文字列を取り、出力としてParseResultsのリストを返す含むことを意味する、ParseResultはC++:std :: cinの複数のコピーを扱う?
template <typename A> using ParseResult = std::pair<A, std::string>
ある場合、パーサーがなかった場合、リストは空です一致しなかった場合は1つの結果が含まれ、複数の(あいまいな)方法で一致する可能性のあるパーサーがさらに結果を返す場合があります。
しかし、これは現在、文字列のコピーが非常に多く行われていることを意味します。また、最初に、最後に構築されたパーサを文字列で呼び出す必要があるため、std::cin
(またはファイルのcoompeteの内容)のすべてが文字列にコピーされます。
パーサーは、文字列の最初の部分(最初の(数個)の文字を見ているだけなので)より良いアイデアのようですが、現在の標準入力ストリーム。そして私はこれがまさにstd::istream
であると信じています。ただし、アイスストリームはコピーできません。どのように私の問題を解決することができますか? 原点があるところから数文字先を指しているistreamのコピーを返す方法はありますか?あるいは、この問題を解決するもう一つのきれいな方法がありますか?
C++の参照は何ですか? – PiotrNycz