5

物理学で数値コードのプロトタイピングにDを使い始めるべきかどうかはまだ評価中です。

私を止める1つのことは、ブースト、特にフュージョンとmplが好きだということです。

Dはテンプレートメタプログラミングにとって素晴らしいものであり、mplやfusionの機能を実行できると思いますが、確認したいと思います。

dを使い始めても、mplレベルに到達するまでには少し時間がかかります。だから誰かに彼らの経験を共有してもらいたい。

(mplとは、テンプレートにstlを使用することを意味し、フュージョンとは、タプルにstlを意味します。)

物理シミュレーションでは重要なので、パフォーマンスに関するメモもいいでしょう。

4

1 に答える 1

7

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 ++コンパイラはより成熟しているので、ここでは間違っている可能性があります。実際に見つける唯一の方法は、特定のユースケースで試してみることです。

于 2013-01-12T15:55:21.287 に答える