也许我已经被 Ruby 宠坏了,但在我看来,如果我有两个使用相同基本逻辑(但细节不同)的函数,我应该只需要编写一次逻辑——因此,我应该只需要在一个地方维护代码。
这是基本逻辑,我在许多不同的功能中重复使用。更改的部分标记为 A、B、C、D、E 和 F。
if (recursions) {
while (lcurr || rcurr) {
if (!rcurr || (lcurr && (lcurr->key < rcurr->key))) {
// A
lcurr = lcurr->next;
} else if (!lcurr || (rcurr && (rcurr->key < lcurr->key))) {
// B
rcurr = rcurr->next;
} else { // keys are == and both present
// C
lcurr = lcurr->next;
rcurr = rcurr->next;
}
}
} else {
while (lcurr || rcurr) {
if (!rcurr || (lcurr && (lcurr->key < rcurr->key))) {
// D
lcurr = lcurr->next;
} else if (!lcurr || (rcurr && (rcurr->key < lcurr->key))) {
// E
rcurr = rcurr->next;
} else { // keys == and both left and right nodes present
// F
lcurr = lcurr->next;
rcurr = rcurr->next;
}
}
}
函数的返回值也可能不同。如果可能的话,我希望能够在不同的地方有额外的逻辑。
我意识到这可以通过 C 宏来完成,但它们似乎不是特别易于维护。我也意识到,如果我的矩阵类型使用嵌套的 STL 列表,这可能会更容易。但是C++11(或旧的C++)中是否有任何功能允许这个逻辑只写一次?也许有人可以用 lambdas 做到这一点吗?