Как запустить код внутри цикла только один раз без внешнего флага?

Я хочу проверить условие внутри цикла и выполнить блок кода при первом его выполнении. После этого цикл может повториться, но блок следует игнорировать. Есть ли образец для этого? Конечно, легко объявить флаг вне цикла. Но меня интересует подход, который полностью живет внутри цикла.

Этот пример не то, что я хочу. Есть ли способ избавиться от определения вне цикла?

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

7

Решение

Это довольно странно, но, как вы сказали, это основной цикл приложения, я предполагаю, что он находится в вызываемой функции, поэтому должно работать следующее:

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

:::

while(true)
{
:::

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

:::

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

:::
}
11

Другие решения

Для менее запутанной версии ответа Мёбиуса:

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

Вы также можете написать это, используя ++ по булу, но это видимо осуждается .

7

возможно более чистый способ написать это, хотя все еще с переменной, был бы следующим

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

Если вы знаете, что хотите запустить этот цикл только один раз, почему бы не использовать break как последнее утверждение в цикле.

0
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-я строка во фрагменте кода)

-1
По вопросам рекламы [email protected]