2012-01-31 66 views
5
struct Matrix(int row, int col){ /* ... */ } 

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

原因mref是因为性能。很显然,我不希望大型矩阵在每次需要反转时都被复制,而且迄今为止工作得很好。如何在编译时使用'ref'?

但是,它已成为其中需要在编译时间的倒数的情况下一个问题:

mixin template A(){ 

    alias Matrix!(3, 3) Matrix3x3; 

    static Matrix3x3 computeSomeMatrix(){ } 

    immutable Matrix3x3 _m = computeSomeMatrix(); 
    immutable Matrix3x3 _m_1 = inverse(computeSomeMatrix()); // error 
} 

要修正这个错误,我需要改变m到非裁判,但是这意味着矩阵将在每次调用inverse()时被复制。我该怎么办?

+0

或者只是简单地同时具有ref和non-ref'inverse()'变体? – DejanLekic 2012-01-31 16:54:36

+1

你得到了什么确切的错误? 'ref'应该在编译时工作,这可能是你正在做的其他事情导致它。 – Robert 2012-01-31 17:20:37

+4

你尝试过'自动参考'吗? – 2012-01-31 17:23:44

回答

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适当的没有你不必担心它的时候。