2013-07-17 35 views
6

我想檢查一個循環內的條件並在第一次遇到時執行一段代碼。之後,循環可能會重複,但該塊應該被忽略。有沒有這樣的模式?當然,在循環之外聲明一個標誌是很容易的。但我對一種完全存在於循環中的方法感興趣。如何在循環中只運行一次沒有外部標誌的代碼?

這個例子不是我想要的。有沒有辦法擺脫循環外的定義?

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

爲什麼不將該代碼移出循環? – sharptooth

+0

我沒有看到如何真實地使用標記的問題。如果我不想這樣做,我只是將它移到其他地方。 – Rapptz

+0

假設「退出循環」不是你正在尋找的東西,你怎麼知道應該只執行一次,以及「何時」? –

回答

10

這是相當哈克,但正如你說這是應用程序的主循環,我想這是在一個名爲一次函數,所以下面應該工作:

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

::: 

while(true) 
{ 
    ::: 

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

    ::: 

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

    ::: 
} 
+0

這是我正在尋找的一種。執行lambda之後,我們可以在構造函數中銷燬實例嗎? – danijar

+1

@danijar不,它具有靜態存儲持續時間,所以它會在程序關閉時被破壞。問題是爲什麼你需要這樣做。請注意,lambda沒有存儲在結構中,只是被執行並被遺忘(即被破壞)。結構實例本身可能會佔用1到4個字節,具體取決於您的編譯器,而不用做任何事情。 – Angew

+0

好吧,它只是不會覺得這麼hacky。 – danijar

3

一個可能更清潔的方式來寫這一點,雖然仍然有變量,將如下

​​

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

'c'不會一直增加,直到它超過'short'的範圍,然後循環並在某個時間再次變爲0? –

+0

有想法。上面的評論是正確的,在下面的代碼塊中遞增'c'更聰明。而且,一個布爾標誌也可以做到這一點。 – danijar

+0

是的,我包含了計數器變量,因爲它在一般情況下可能更有用。 – Mobius

0

如果你知道你只需要運行一次這個循環,爲什麼不使用break作爲循環中的最後一個語句。

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

+0

請閱讀問題下的意見。例如,如果玩家等級超過給定數量,他應該獲得一次獎勵。我不能降低玩家等級,只是爲了不把獎勵交給兩次。 'while(1){if(level> 7){once([=] {award();}); }}' – danijar

+0

請再次閱讀這個問題下的評論,因爲第一個問題是,如果沒有使用標誌如何實現,那麼只有他正在考慮下一個選項。 – Meg

+0

這有什麼關係天氣該標誌是一個布爾變量之前的'while'循環或條件函數內的另一個標誌? – danijar

7

對於默比烏斯的回答不太令人費解的版本:

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

你也可以寫這個使用++上一個布爾值,但是這顯然deprecated