【发布时间】:2013-08-01 18:24:10
【问题描述】:
也许我已经被 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 做到这一点?
【问题讨论】:
-
有哪些不同的细节?发现它们有点困难......你不能写一些更小的例子吗?
-
没有检查整个逻辑,但
reinterpret_cast几乎总是错误的。另外,我不知道你在做什么,但它似乎过于复杂......你能用简单的语言描述你的算法做什么吗? -
我注意到你似乎没有在任何地方使用
left和right,除了递归地传递它们。 -
有一个方法。编写函数和函数模板。在内部,调用其他(或相同)函数和函数模板。基本上,你会在 Ruby 中做同样的事情。你试过吗?如果是,出了什么问题?
-
在我看来,这是一个使用枚举器的情况,就像在 C# 中一样。不幸的是,您没有使用 C#。
标签: c++ c++11 metaprogramming