テンプレートメタプログラミング

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

掘り下げる

ベーシック・リファレンス

アドバンスト・リファレンス

rdmd playground.d