如何在没有外部标志的情况下只在循环内运行一次代码?

时间:2013-07-17 13:33:39

标签: c++ loops design-patterns flags control-flow

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

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

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

5 个答案:

答案 0 :(得分:11)

这是相当hacky,但正如你所说的那样是应用程序主循环,我认为它是在一次调用函数中,所以下面应该有效:

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

:::

while(true)
{
  :::

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

  :::

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

  :::
}

答案 1 :(得分:8)

对于一个不太复杂的Mobius的答案:

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上写这个,但显然deprecated

答案 2 :(得分: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允许你在循环中声明变量,IMHO看起来更干净。如果你每次执行的代码都进行了一些可测试的更改,你可以删除变量并按如下方式编写它:

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.
 }

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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行)