D中的代数包
D可以在常量参数(编译时已知)上对函数进行专门化pow(base, exponent)
如果exponent
是一个常量整数,则通常用于pow(base, exponent)
。 由于C ++缺乏这种功能,它不得不采用模板专业化的方式来模糊API,例如Boost.Units中的pow
函数模板。
但是,在线性代数包中也不能使用常量参数专门化来专门化矩阵运算,例如矩阵运算 - 对于固定维数情况,例如2-D / 3-D中通常使用的2x2,3x3,3x3,4x3和4x4图形。 这些重载通常是使用SIMD指令(内部函数)实现的,如果这些实现可以由这样的库自动选择适合固定大小的矩阵和向量,那将是非常棒的。
我相信这对于D来说是一个真正的杀手级应用,特别是在科学可视化方面。 这是因为高级/动态维度线性代数和固定维度2-D / 3-D之间的桥梁对于使用实现这些想法的包的开发人员而言可以完全透明。
对于D来说,已经有好几个很好的2-,3-,和4-D线性代数包,比如gl3n。 我很想看到它被扩展为提供包含在C ++库(如Eigen和Armadillo)中的函数。
但是,在线性代数包中不能使用常量参数专门化来专门化矩阵运算,例如2d / 3d图形中常用的2x2,3x3,3x3,4x3和4x4等固定维数情况下的矩阵向量乘法。
是的,这是完全可能的,而且很容易。 有几种方法可以做到这一点:
static if
。 这里是一个使用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
在编译时被评估,所以在运行时没有分支成本。
下一篇: Haskell Linear Algebra Matrix Library for Arbitrary Element Types