gpt4 book ai didi

STL - D std lib 是否包含诸如 boost.fusion 和 boost.mpl 之类的东西?

转载 作者:行者123 更新时间:2023-12-04 18:11:02 24 4
gpt4 key购买 nike

我仍在评估是否应该开始使用 D 来制裁剪理数字代码的原型(prototype)。

阻止我的一件事是我喜欢 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++ 编译器更成熟,所以我在这里可能是错误的。您真正发现的唯一方法是针对您的特定用例进行尝试。

关于STL - D std lib 是否包含诸如 boost.fusion 和 boost.mpl 之类的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14287519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com