1

D 可以将函数专门用于常量参数(在编译时已知),通常用于pow(base, exponent)ifexponent是一个常量整数。由于 C++ 缺乏此功能,因此它不得不求助于模板专业化黑客,这会掩盖 API,例如powBoost.Units 中的函数模板。

但是,不能在线性代数包中使用常量参数专门化来专门化矩阵运算,例如针对固定维度情况的矩阵向量乘法,例如 2-D/3-D 中常用的 2x2、3x3、3x3、4x3 和 4x4图形。这些重载通常是使用 SIMD 指令(内在函数)实现的,如果这些实现可以由这样的库自动选择用于合适的固定大小的矩阵和向量,那就太棒了。

我相信这将是 D 的真正杀手级应用,尤其是在科学可视化方面。这是因为更高/动态维度线性代数和固定维度 2-D/3-D 之间的桥梁对于使用实现这些想法的包的开发人员来说是完全透明的。

已经有几个不错的用于 D 的 2-、3-和 4-D 线性代数包,例如 gl3n。我很乐意看到它被扩展以提供包含在 C++ 库中的函数,例如 Eigen 和 Armadillo。

4

1 回答 1

1

但是,不能在线性代数包中使用常量参数专门化来专门化矩阵运算,例如针对固定维度情况的矩阵向量乘法,例如 2d/3d 图形中常用的 2x2、3x3、3x3、4x3 和 4x4。

是的,这是完全可能的,而且非常容易。有几种方法可以做到:

  • 使用模板专业化。
  • 使用模板函数约束。
  • 使用static if.

static if这是一个用于向量加法的示例。

Vec!N add(int N)(Vec!N a, Vec!N b)
{
    static if (N == 4)
    {
        // Use vector ops
    }
    else
    {
        // Use generic routine
    }
}

是在编译时评估的static if,因此在运行时没有分支成本。

于 2013-01-10T00:41:56.440 回答