D可以专门化常量参数上的函数(在编译时已知),如果pow(base, exponent)
是一个常量整数,通常用于exponent
。由于C ++缺少此功能,因此它必须采用模板特化 - 黑客来掩盖API,例如Boost.Units中的pow
函数模板。
但是,无法在线性代数包中使用常量参数专门化来专门化矩阵运算,例如2x2,3x3,3x3,4x3和4x4等固定维度情况下的矩阵向量乘法三维图形。这些重载通常使用SIMD指令(内在函数)实现,如果这些实现可以由这样的库自动选择适合固定大小的矩阵和向量,那将是很棒的。
我相信这对D来说是一个真正的杀手级应用,特别是在科学可视化方面。这是因为高级/动态维度线性代数和固定维度2-D / 3-D之间的桥梁可以使开发人员完全透明,使用实现这些想法的包。
已经有几个很好的用于D的2维,3维和4维线性代数包,例如gl3n。 我很乐意看到它被扩展为提供C ++库中包含的函数,如Eigen和Armadillo。
答案 0 :(得分:1)
但是,不能在线性代数包中使用常量参数专门化来专门化矩阵运算,例如2x / 3x图形中通常使用的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
在编译时进行评估,因此在运行时没有分支成本。