while (!Queue.empty())
要素のキューを処理するループがあります。優先度の高いものから低いものへと続く一連のパターンマッチャーがあります。パターンが一致すると、対応する要素がキューから削除され、一致が上から再開されます(これにより、最も優先度の高いマッチャーが最初に行動する機会が得られます)。
したがって、現在は次のようになっています(簡略化されたバージョン)。
while (!Queue.empty())
{
auto & Element = *Queue.begin();
if (MatchesPatternA(Element)) { // Highest priority, since it's first
// Act on it
// Remove Element from queue
continue;
}
if (MatchesPatternB(Element)) {
// Act on it
// Remove Element from queue
continue;
}
if (MatchesPatternC(Element)) { // Lowest priority, since it's last
// Act on it
// Remove Element from queue
continue;
}
// If we got this far, that means no pattern was matched, so
// Remove Element from queue
}
これは機能しますが、キーワードの使用を削除するために、何らかの方法でこのループをリファクタリングしたいと思いますcontinue
。
なんで?なぜなら、外部関数に一致するパターンを外部委託したい場合、それは明らかに壊れます。例えば
void ExternalMatching(...)
{
if (MatchesPatternB(Element)) {
// Act on it
// Remove Element from queue
continue; // This won't work here
}
}
while (!Queue.empty())
{
auto & Element = *Queue.begin();
if (MatchesPatternA(Element)) {
// Act on it
// Remove Element from queue
continue;
}
ExternalMatching(...);
if (MatchesPatternC(Element)) {
// Act on it
// Remove Element from queue
continue;
}
// If we got this far, that means no pattern was matched, so
// Remove Element from queue
}
のようなifステートメントを繰り返し書く必要はありませんif (ExternalMatching(...)) { ... continue; }
。むしろ、このロジックを表現するためのよりクリーンな方法を見つけたいと思います。
この単純化された例では、異なるMatchesPatternA
、、、などの関数を使用するのではなく、パターンマッチングをより一般的にすることをお勧めします。しかし、私の状況では、パターンは非常に複雑であり、まだ一般化する準備ができていません。ですから、その部分をそのままにして、別々の機能にしたいのです。MatchesPatternB
MatchesPatternC
エレガントなアイデアはありますか?ありがとうございました!