我有一个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
等函数似乎是一个好主意。但在我的情况下,模式非常复杂,我还没有准备好概括它们。所以我想保持那部分原样,单独的功能。
有什么优雅的想法吗?谢谢!