如何在编译时使用'ref'?

时间:2012-01-31 16:43:48

标签: d

struct Matrix(int row, int col){ /* ... */ }

// finds the inverse using Gauss–Jordan elimination
pure M inverse(M)(const ref M m){ /* ... */ }

mref的原因是因为效果。显然,我不希望每次需要反向时都会复制大型矩阵,到目前为止这种方法运行良好。

但是,在编译时需要逆的情况下,它已经成为一个问题:

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()时都会复制矩阵。我该怎么办?

1 个答案:

答案 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,而不必担心。