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

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

Powodem m jest ref ze względu na wydajność. Oczywiście nie chcę, aby kopie dużych matryc były kopiowane za każdym razem, gdy odwrotność jest potrzebna, a to działało jak dotąd dobrze.Jak używać "ref" w czasie kompilacji?

Ale to stało się problemem w sytuacji, w której odwrotność jest potrzebne w czasie kompilacji:

mixin template A(){ 

    alias Matrix!(3, 3) Matrix3x3; 

    static Matrix3x3 computeSomeMatrix(){ } 

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

naprawić błąd, muszę zmienić m do non-ref, ale to oznacza, że ​​matryce zostanie skopiowany za każdym razem, gdy wywoływana jest nazwa inverse(). Co ja robię?

+0

Lub po prostu mają zarówno ref i non-ref 'inverse()' warianty? – DejanLekic

+1

Jaki jest dokładny błąd, który otrzymujesz? 'ref' powinno działać w czasie kompilacji, prawdopodobnie coś innego, co robisz, powoduje to. – Robert

+4

Czy próbowałeś 'auto ref'? –

Odpowiedz

4

Widzę jedną z dwóch opcji. Po pierwsze, utwórz wersję, która przyjmuje wartość r. Często irytujące jest to, że funkcja i tak nie działa z wartościami r. Prosty wrapper jest wszystko, czego potrzebujesz:

pure M inverse(M)(const ref M m){ /* ... */ } 
pure M inverse(M)(const M m){ inverse(m); } 

Bądź ostrożny, że const-ności od parametrów odpowiada jednak, czy masz zamiar dostać nieskończonej rekurencji.

Jednak lepszym rozwiązaniem byłoby użycie auto ref. Właśnie do tego został stworzony.

pure M inverse(M)(const auto ref M m){ /* ... */ } 

Kompilator będzie następnie wykorzystać ref gdy właściwe i nie- ref razie potrzeby bez konieczności martwić.

Powiązane problemy