Dでは、ほとんどの場合、メタプログラミングは単なるプログラミングです。 boost.mplのようなライブラリは実際には必要ありません。
例えば、コンパイル時に配列の配列をソートするには、C++で長さを考慮する必要があります。 Dでは、あなただけの明白なことを行います。これは、コンパイル時に[1, 2, 3]
を出力std.algorithm.sort
import std.algorithm;
int[] sorted(int[] xs)
{
int[] ys = xs.dup;
sort(ys);
return ys;
}
pragma(msg, sorted([2, 1, 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++コンパイラはより成熟しているので、ここで間違っている可能性があります。あなたが実際に見つけ出す唯一の方法は、あなたの特定のユースケースのために試してみることです。
*テンプレート*メタプログラミングは本当に必要ありません。 Dにコンパイル時の関数評価があります。 – Mehrdad
@Mehrdadすべてですか?あなたはfind_ifやテンプレートのパラメータを変換することができますか? –
すべてではありません(まだ修正が必要なバグがあります)が、かなりのものがあります。それは一般的な答えを与えるのは難しいですが、あなたが特定の例を持っていればそれを投稿してください。私はそれをCTFEのバージョンで見せてくれます。 – Mehrdad