14

ループ内の条件をチェックし、最初に満たされたときにコード ブロックを実行したいと考えています。その後、ループが繰り返される可能性がありますが、ブロックは無視する必要があります。そのパターンはありますか?もちろん、ループの外でフラグを宣言するのは簡単です。しかし、ループ内に完全に存在するアプローチに興味があります。

この例は私が望むものではありません。ループの外で定義を取り除く方法はありますか?

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

5 に答える 5

14

かなりハックですが、アプリケーションのメインループだとおっしゃっていたように、一度だけ呼び出される関数にあると想定しているため、次のように動作するはずです。

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

ブール値を使用してこれを記述することもできますが++、それは明らかに非推奨です

于 2014-05-06T15:59:06.760 に答える
0

このループを 1 回だけ実行したいことがわかっている場合はbreak、ループの最後のステートメントとして使用しないでください。

于 2013-07-17T19:44:59.650 に答える