D 如何使用';参考';在编译时?
原因D 如何使用';参考';在编译时?,d,D,原因m是一个ref是因为性能。显然,我不希望每次需要求逆时都要复制大矩阵,到目前为止,这种方法效果很好 但是,在编译时需要求逆的情况下,这已成为一个问题: struct Matrix(int row, int col){ /* ... */ } // finds the inverse using Gauss–Jordan elimination pure M inverse(M)(const ref M m){ /* ... */ } 要修复错误,我需要将m更改为非ref,但这意味着每次调
m
是一个ref
是因为性能。显然,我不希望每次需要求逆时都要复制大矩阵,到目前为止,这种方法效果很好
但是,在编译时需要求逆的情况下,这已成为一个问题:
struct Matrix(int row, int col){ /* ... */ }
// finds the inverse using Gauss–Jordan elimination
pure M inverse(M)(const ref M m){ /* ... */ }
要修复错误,我需要将
m
更改为非ref,但这意味着每次调用inverse()
时都会复制矩阵。我该怎么办?我看到两个选项中的一个。第一,创建一个采用右值的版本。当一个函数无论如何都不能与右值一起工作时,这常常令人讨厌。您只需要一个简单的包装器:
mixin template A(){
alias Matrix!(3, 3) Matrix3x3;
static Matrix3x3 computeSomeMatrix(){ }
immutable Matrix3x3 _m = computeSomeMatrix();
immutable Matrix3x3 _m_1 = inverse(computeSomeMatrix()); // error
}
不过,要注意参数的常数要匹配,否则会得到无限递归
但是,更好的解决方案是使用auto-ref
。这就是它创建的目的
pure M inverse(M)(const ref M m){ /* ... */ }
pure M inverse(M)(const M m){ inverse(m); }
编译器将在适当的时候使用
ref
,在适当的时候使用非ref
,而您不必担心它。或者只是同时使用ref和非refinverse()
变量?您得到的确切错误是什么ref
应该在编译时工作,可能是您正在执行的其他操作导致了它。@Robert错误说computeSomeMatrix()
不是左值。@CyberShadow嗯<代码>逆(M)(自动常数参考M){}工作。想解释一下吗?@DejanLekic这只是代码重复。
pure M inverse(M)(const auto ref M m){ /* ... */ }