2011-07-31 72 views
4

我有一個d混入,我想用它來生成一個switch語句(案值,特別是),但儘管有它的條目,並提供正確的鍵值KeyValues,默認情況下,始終執行的只有一個:d混入用繩子switch語句

class DataStore(KeyValues...) { 
    void stringSetData(string key, string data) { 
     switch(key) { 
      foreach(D; KeyValues) { 
       mixin("case \"" ~ D.Name ~ "\": set(to!(D.Type)(data)); break;"); 
      } 
      default: 
       throw new Exception("Invalid meta key"); break; 
     } 
    } 
} 

我已經與硬編碼值進行了測試,它工作正常,所以我懷疑是我可能會做什麼毛病我的mixin本身。我如何才能讓它按預期工作?

+0

你甚至可以在'switch'裏面加入'foreach'嗎?我從來沒有看到過... – Mehrdad

+0

邁赫達德:這是一個'foreach'了一個元組,因此它在編譯時展開(見「的foreach對元組的」 [這裏](HTTP://www.d-programming- language.org/statement.html#ForeachStatement))。 –

+0

馬克:我認爲'KeyValues' /'KeyValue'是一個錯字? –

回答

5

mixin裏面的break是從foreach循環中打破,而不是switch。將其替換爲return或標記爲break。順便說一下,如果您嘗試在啓用警告的情況下編譯此代碼,則會從DMD中收到一些奇怪的錯誤消息。