2016-04-09 7 views
2

私は特定の引数でのみ有効なmixinテンプレートを持っています。引数が無効な場合、エラーメッセージでコンパイルを停止したい。テンプレートの場合はassert(false, "Invalid args for Yoo")を使用しますが、これはmixinテンプレートでは機能しません。下の例のコンパイルを停止するには?mixinテンプレート:コンパイルを中断する方法は?

mixin template Yoo(args...) { 
    static if (args.length == 0) { 
    pragma(msg, "Invalid args! (how to halt the compilation?)"); 
    } else { 
    pragma(msg, "Valid args:", args); 
    } 
} 

void main() { 
    mixin Yoo; 
    mixin Yoo!(1,2,3); 
} 

答えて

5

あなたの代わりにプラグマMSGの

static assert(0, "Invalid args!"); 

を行うことができます。静的アサートはassertのようなもので、コンパイル時のみであり、コンパイル中にチェックされ、コンパイル済みコードには含まれないため、リリースモードでは削除されません。

4

static assertする代わりに、テンプレートの制約である:上記で

mixin template Yoo(args...) if (args.length > 0) { 

Yoo!()

Error: mixin d.Yoo!() does not match template declaration Yoo(args...) if (args.length > 0)

のようなメッセージでコンパイルに失敗するこれの利点は、他の誰かであれば、ということです彼らは 自身のYooを定義することができました。にargsを受け入れません。 static assertとテンプレートなしのテンプレート の場合、それらの定義は競合します。

ただし、static assertでは、より便利なメッセージを提供できます。

関連する問題