我仍在评估是否应该开始使用 D 来制作物理数字代码的原型。
阻止我的一件事是我喜欢 boost,特别是 fusion 和 mpl。
D 非常适合模板元编程,我认为它可以做 mpl 和 fusion 的东西,但我想确定一下。
即使我将开始使用 d,我也需要一段时间才能达到 mpl 级别。所以我希望有人分享他们的经验。
(通过 mpl 我的意思是将 stl 用于模板,通过融合,我的意思是 stl 用于元组。)
关于性能的注释也很好,因为它在物理模拟中至关重要。
我仍在评估是否应该开始使用 D 来制作物理数字代码的原型。
阻止我的一件事是我喜欢 boost,特别是 fusion 和 mpl。
D 非常适合模板元编程,我认为它可以做 mpl 和 fusion 的东西,但我想确定一下。
即使我将开始使用 d,我也需要一段时间才能达到 mpl 级别。所以我希望有人分享他们的经验。
(通过 mpl 我的意思是将 stl 用于模板,通过融合,我的意思是 stl 用于元组。)
关于性能的注释也很好,因为它在物理模拟中至关重要。
在 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++ 编译器更成熟,所以我在这里可能是错误的。您真正发现的唯一方法是针对您的特定用例进行尝试。