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

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

mref nedenidir. Açıkçası, her zaman tersine ihtiyaç duyulan büyük matrislerin kopyalanmasını istemiyorum ve bu şimdiye kadar gayet iyi çalıştı.Derleme zamanında 'ref' nasıl kullanılır?

Ama, ters derleme zamanında ihtiyaç duyulan durumlarda bir sorun haline gelmiştir:

mixin template A(){ 

    alias Matrix!(3, 3) Matrix3x3; 

    static Matrix3x3 computeSomeMatrix(){ } 

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

Ben olmayan bir ref etmek m değiştirmeniz gerekir, hatayı düzeltmek için, ama bu matrisler demektir inverse() her seferinde kopyalanacaktır. Ben ne yaparım?

+0

Ya da sadece ref ve non-ref 'inverse()' türevleri var? – DejanLekic

+1

Aldığınız tam hata nedir? 'ref', derleme zamanında çalışmalı, muhtemelen buna neden olan başka bir şey. – Robert

+4

'auto ref' denediniz mi? –

cevap

4

İki seçenekten birini görüyorum. Bir, bir değer alan bir sürüm oluşturun. Bir işlev, yine de rvalues ​​ile çalışmadığı zaman sıkıcıdır. Basit bir sarıcı tüm ihtiyaç vardır:

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

parametrelerin const-lik olsa eşleştiğini dikkatli olun, yoksa sonsuz özyinelemeye alacaksın. Bununla birlikte, auto ref kullanmak daha iyi bir çözüm olacaktır. Bunun için yaratılmış olan şey budur.

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

derleyici sonra kullanacağı ref uygun olduğunda ve ref olmayan zaman bu konuda endişe etmeden uygun.