我经常需要类似do-while-do循环的东西。目前我实现了这样的概念:
Instructions part 1 (for instance: read data)
while(Condition){
Instructions part 2 (save data)
Instructions part 1 (read next data)
}
我必须两次写第1部分,这很难看。是否有可能摆脱重复? 我想到了这样一个概念:
do{
Instructions part 1
} while (Condition) do {
Instructions part 2
}
答案 0 :(得分:4)
我通常通过以下方式解决类似的问题:
while (true) {
Instructions part 1
if (!Condition) {
break;
}
Instructions part 2
}
答案 1 :(得分:3)
我更喜欢只有一次读/取
的方法类似的东西:
bool readData(SomeObject & outPut) {
perform read
return check-condition
}
while (!readData (outObj)) {
// work on outObj
}
答案 2 :(得分:1)
如果您将part 1
放入返回bool
的函数中,您可以执行以下操作:
while (DoPart1())
{
DoPart2();
}
答案 3 :(得分:0)
您可以定义一个小模板功能
template<typename Part1, typename Condition, typename Part2>
void do_while_do(Part1 part1, Condition condition, Part2 part2)
{
part1();
while(condition()) {
part2();
part1();
}
}
并将其与函数,仿函数或lambdas一起使用,即
some_type tmp;
do_while_do([&]() { read(tmp); },
[&]() { return cond(tmp); },
[&]() { save(tmp); });
当然,lambda捕获有一些开销,但至少part1
没有重复(可能很长)的代码。当然,可以对模板进行细化以处理要携带的参数(例如示例中的tmp
)。
答案 4 :(得分:0)
这可以通过for
循环来完成。
for (bool flag = false; Condition; flag |= true)
{
if (flag)
DoPart2();
DoPart1();
}