Dでは、ほとんどの場合、メタプログラミングは単なるプログラミングです。boost.mplのようなライブラリは実際には必要ありません
たとえば、コンパイル時に数値の配列を並べ替えるためにC++で実行する必要がある長さを考慮してください。Dでは、あなたは明白なことをするだけです:使用するstd.algorithm.sort
import std.algorithm;
int[] sorted(int[] xs)
{
int[] ys = xs.dup;
sort(ys);
return ys;
}
pragma(msg, sorted([2, 1, 3]));
[1, 2, 3]
これはコンパイル時に出力されます。注:sort
言語に組み込まれておらず、コンパイル時に機能するための特別なコードはまったくありません。
コンパイル時にフィボナッチ数列のルックアップテーブルを作成する別の例を次に示します。
int[] fibs(int n)
{
auto fib = recurrence!("a[n-1] + a[n-2]")(1, 1);
int[] ret = new int[n];
copy(fib.take(n), ret);
return ret;
}
immutable int[] fibLUT = fibs(10).assumeUnique();
ここfibLUT
でも、特別なコンパイル時コードを必要とせずに、コンパイル時に完全に構築されます。
型を操作する場合は、にいくつかの型メタ関数がありstd.typetuple
ます。例えば:
static assert(is(Filter!(isUnsigned, int, byte, ubyte, dstring, dchar, uint, ulong) ==
TypeTuple!(ubyte, uint, ulong)));
そのライブラリには、Fusionから取得できる機能のほとんどが含まれていると思います。ただし、ほとんどの言語はコンパイル時に使用できるため、C ++の場合ほど、Dでテンプレートメタプログラミングを使用する必要はありません。
どちらも経験が浅いので、パフォーマンスについてはコメントできません。ただし、私の本能では、通常、多数のテンプレートをインスタンス化する必要がないため、Dのコンパイル時の実行が高速になります。もちろん、C ++コンパイラはより成熟しているので、ここでは間違っている可能性があります。実際に見つける唯一の方法は、特定のユースケースで試してみることです。