14

我想检查循环内的条件并在第一次遇到时执行一段代码。之后,循环可能会重复,但应该忽略该块。有这样的模式吗?当然,在循环之外声明一个标志很容易。但我对完全存在于循环中的方法感兴趣。

这个例子不是我想要的。有没有办法摆脱循环之外的定义?

bool flag = true;
for (;;) {
    if (someCondition() && flag) {
        // code that runs only once
        flag = false;
    }        
    // code that runs every time
}
4

5 回答 5

14

它相当hacky,但正如你所说的它是应用程序主循环,我假设它在一个调用一次的函数中,所以以下应该工作:

struct RunOnce {
  template <typename T>
  RunOnce(T &&f) { f(); }
};

:::

while(true)
{
  :::

  static RunOnce a([]() { your_code });

  :::

  static RunOnce b([]() { more_once_only_code });

  :::
}
于 2013-07-17T13:45:29.800 回答
12

对于莫比乌斯答案的不那么复杂的版本:

while(true)
{
  // some code that executes every time
  for(static bool first = true;first;first=false)
  {
    // some code that executes only once
  }
  // some more code that executes every time.
}

您也可以使用++bool 来编写此代码,但这显然已被弃用

于 2014-05-06T15:59:06.760 回答
3

一种可能更简洁的编写方式,尽管仍然带有变量,但如下所示

while(true){
   static uint64_t c;
   // some code that executes every time
   if(c++ == 0){
      // some code that executes only once
   }
   // some more code that executes every time.
 }

允许您在static循环内声明变量,恕我直言,看起来更干净。如果您每次执行的代码都进行了一些可测试的更改,您可以摆脱该变量并像这样编写它:

while(true){
   // some code that executes every time
   if(STATE_YOUR_LOOP_CHANGES == INITIAL_STATE){
      // some code that executes only once
   }
   // some more code that executes every time.
 }
于 2013-07-17T13:48:54.637 回答
0

如果您知道只想运行此循环一次,为什么不将break其用作循环中的最后一条语句。

于 2013-07-17T19:44:59.650 回答
-2
1    while(true)
2    {
3        if(someCondition())
4        {
5            // code that runs only once
6            // ...
7          // Should change the value so that this condition must return false from next execution.
8        }        
9    
10        // code that runs every time
11        // ...
12    }

如果您希望代码没有任何外部标志,那么您需要在条件的最后一条语句中更改条件的值。(代码片段中的第 7 行)

于 2013-07-18T09:31:38.687 回答