概念do-while-do-loop

时间:2013-08-27 13:34:10

标签: c++ loops while-loop

我经常需要类似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 
}

5 个答案:

答案 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();
}