struct Matrix(int row, int col){ /* ... */ }
// finds the inverse using Gauss–Jordan elimination
pure M inverse(M)(const ref M m){ /* ... */ }
m
是ref
的原因是因为效果。显然,我不希望每次需要反向时都会复制大型矩阵,到目前为止这种方法运行良好。
但是,在编译时需要逆的情况下,它已经成为一个问题:
mixin template A(){
alias Matrix!(3, 3) Matrix3x3;
static Matrix3x3 computeSomeMatrix(){ }
immutable Matrix3x3 _m = computeSomeMatrix();
immutable Matrix3x3 _m_1 = inverse(computeSomeMatrix()); // error
}
要修复错误,我需要将m
更改为非ref,但这意味着每次调用inverse()
时都会复制矩阵。我该怎么办?
答案 0 :(得分:4)
我看到两种选择之一。一,创建一个带右值的版本。当一个函数无法使用rvalues时,它经常很烦人。您只需要一个简单的包装器:
pure M inverse(M)(const ref M m){ /* ... */ }
pure M inverse(M)(const M m){ inverse(m); }
请注意参数的常量匹配,否则您将获得无限递归。
但是,更好的解决方案是使用auto ref
。这就是为它创建的。
pure M inverse(M)(const auto ref M m){ /* ... */ }
然后,编译器将在适当时使用ref
,在适当时使用非ref
,而不必担心。