2013-01-11 5 views
5

物理学で数値コードのプロトタイプ作成にDを使用する必要があるかどうかはまだ評価しています。D std libにはboost.fusionやboost.mplのようなものが含まれていますか?

私を止めることの1つは、私がブースト、特に融合とmplが好きなことです。

Dはテンプレートメタプログラミングにとって驚くべきことです。私はそれがmplやfusionのものをやることができると思いますが、私は確信しています。

dを使用しても、mplレベルになるまでにはしばらく時間がかかります。だから、私は誰かが自分の経験を分かち合うようにしたい。それは物理シミュレーションに重要ですので、パフォーマンスに

(MPLによって私はテンプレートのSTLを使用することを意味し、融合によって、私はタプルのSTLを意味する。)

ノートでは、あまりにもいいだろう。

+0

*テンプレート*メタプログラミングは本当に必要ありません。 Dにコンパイル時の関数評価があります。 – Mehrdad

+0

@Mehrdadすべてですか?あなたはfind_ifやテンプレートのパラメータを変換することができますか? –

+0

すべてではありません(まだ修正が必要なバグがあります)が、かなりのものがあります。それは一般的な答えを与えるのは難しいですが、あなたが特定の例を持っていればそれを投稿してください。私はそれをCTFEのバージョンで見せてくれます。 – Mehrdad

答えて

7

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

関連する問題