C++のテンプレートメタプログラミングに触れたことがあるなら、 Dの提供するあなたの生活をより簡単にするツールに安心できるでしょう。 テンプレートメタプログラミングは意思決定をテンプレート型プロパティに依存するようにする技術で、 それがインスタンス化される時の型をもとにジェネリック型をより一層フレキシブルにします。
static if
& is
普通のif
のように、static if
はコンパイル時に計算できる条件をもとに
条件付きでコードブロックをコンパイルします:
static if(is(T == int))
writeln("T is an int");
static if (is(typeof(x) : int))
writeln("Variable x implicitely converts to int");
is
式は条件をコンパイル時に計算する
ジェネリックヘルパです。
static if(is(T == int)) { // Tはテンプレートパラメータ
int x = 10;
}
条件がtrue
の場合中括弧は無視されます - 新しいスコープは作られません。
{ {
と} }
は新しいブロックを明示的に作ります。
static if
はコード中のどこででも使えます - 関数内で、グローバルスコープで、型定義の中で。
mixin template
定型文を見るところどこでも、mixin template
はあなたの友達です:
mixin template Foo(T) {
T foo;
}
...
mixin Foo!int; // int fooをここで利用できます。
mixin template
は初期化点に挿入される任意の数の
複雑な式を含むことがあります。あなたがCから来たなら、
プリプロセッサとはサヨナラしましょう!
テンプレートは型が持つ必要があるプロパティを強制する 任意の数の制約とともに定義されることがあります:
void foo(T)(T value)
if (is(T : int)) { // foo!T はTがintに
// 変換される場合のみ有効
}
制約はブール式と組み合わせることができ、コンパイル時に計算できる
関数呼び出しを含むことがあります。たとえばstd.range.primitives.isRandomAccessRange
は型が[]
オペレータをサポートするレンジかどうかチェックします。