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
は型が[]オペレータをサポートするレンジかどうかチェックします。