2011-07-31 10 views
4

私はDミックスインを持っています。これは、文字列値に対してswitchステートメント(具体的には大文字と小文字の値)を生成するために使用しますが、KeyValuesにエントリがあり、デフォルトの場合は、常に実行唯一のものです:Dミックスインとストリングスイッチステートメント

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

私は、ハードコードされた値でこれをテストしてみた、と期待どおりに動作しますので、私の疑惑は、私は私のミックスイン自体に何かをやっているかもしれないということです。これを期待どおりに動作させるにはどうすればよいですか?

+0

あなたは 'switch 'のような' foreach'をそのようにすることさえできますか?私は前にそれを見たことがない... – Mehrdad

+0

Mehrdad:それはタプルの上の 'foreach'なので、コンパイル時に展開されます("タプルの上のForeach "[here](http://www.d-programming- language.org/statement.html#ForeachStatement))。 –

+0

マーク: 'KeyValues' /' KeyValue'が誤字だと思いますか? –

答えて

5

ミックスインの中のbreakは、ではなく、foreachループから外れています。 return、またはbreakというラベルに交換してください。

ところで、警告を有効にしてこのコードをコンパイルしようとすると、DMDから奇妙なエラーメッセージが表示されます。

関連する問題