5

我仍在评估是否应该开始使用 D 来制作物理数字代码的原型。

阻止我的一件事是我喜欢 boost,特别是 fusion 和 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 回答