我想检查一个循环中的条件,并在第一次遇到时执行一段代码。之后,循环可能会重复,但应忽略该块。那有什么模式吗?当然,在循环之外声明一个标志很容易。但是我对一种完全存在于循环中的方法感兴趣。
这个例子不是我想要的。有没有办法摆脱循环之外的定义?
bool flag = true;
for (;;) {
if (someCondition() && flag) {
// code that runs only once
flag = false;
}
// code that runs every time
}
答案 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行)