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和非ref
inverse()
变量?您得到的确切错误是什么
ref
应该在编译时工作,可能是您正在执行的其他操作导致了它。@Robert错误说
computeSomeMatrix()
不是左值。@CyberShadow嗯<代码>逆(M)(自动常数参考M){}工作。想解释一下吗?@DejanLekic这只是代码重复。
pure M inverse(M)(const auto ref M m){ /* ... */ }