0

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

5 回答 5

5

我通常通过这样做来解决类似的问题:

while (true) {
  Instructions part 1
  if (!Condition) {
    break;
  }
  Instructions part 2
}
于 2013-08-27T13:36:26.693 回答
3

我更喜欢只有一次读取/获取的方法

就像是:

bool readData(SomeObject & outPut) {
  perform read
  return check-condition
}

while (!readData (outObj)) {
  // work on outObj
}
于 2013-08-27T13:39:53.727 回答
1

如果您放入part 1一个返回的函数bool,您可以执行以下操作:

while (DoPart1())
{
    DoPart2();
}
于 2013-08-27T13:42:55.507 回答
0

你可以定义一个小模板函数

template<typename Part1, typename Condition, typename Part2>
void do_while_do(Part1 part1, Condition condition, Part2 part2)
{
   part1();
   while(condition()) {
     part2();
     part1();
   }
}

并将其与函数、函子或 lambda 一起使用,即

some_type tmp;
do_while_do([&]() { read(tmp); },
            [&]() { return cond(tmp); },
            [&]() { save(tmp); });

当然,lambda 捕获有一些开销,但至少没有重复(可能很长)的part1. 当然,可以改进模板以处理要携带的参数(如tmp示例中所示)。

于 2013-08-28T17:06:06.897 回答
0

这可以通过for循环来完成。

for (bool flag = false; Condition; flag |= true)
{
    if (flag)
        DoPart2();
    DoPart1();
}
于 2019-09-27T15:39:41.530 回答