D可以根据常量参数对函数进行专门化(在编译时已知),如果exponent
是常数整数,则通常针对pow(base, exponent)
。由于c++缺乏这一特性,它不得不求助于模板专门化,以模糊API,例如Boost.Units中的pow
函数模板。
但是,常数参数专门化是否也可以在线性代数包中使用,以专门化矩阵运算,例如固定维情况下的矩阵-向量乘法,例如通常用于2-D/3-D图形的2x2, 3x3, 3x3, 4x3和4x4。这些重载通常是使用SIMD指令(intrinsic)实现的,如果这些实现可以由这样一个库自动选择合适的固定大小的矩阵和向量,那将是非常棒的。
我相信这将是D的一个真正的杀手级应用程序,特别是在科学可视化方面。这是因为高维/动态维线性代数和固定维二维/三维之间的桥梁可以完全透明地为开发人员使用实现这些思想的包。
已经有几个很好的二维、三维和四维线性代数包,比如gl3n。我很乐意看到它被扩展,以提供包含在c++库(如Eigen和Armadillo)中的函数。
但是,常数参数专门化是否也可以在线性代数包中使用,以专门化矩阵运算,例如固定维情况下的矩阵-向量乘法,例如通常用于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
在编译时求值,因此在运行时没有分支成本。