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){ /* ... */ } 

El motivo m es un ref es por rendimiento. Obviamente, no quiero que se copien matrices grandes cada vez que se necesite la inversa, y hasta ahora ha funcionado bien.¿Cómo usar 'ref' en tiempo de compilación?

embargo, se ha convertido en un problema en las situaciones donde se necesita la inversa en tiempo de compilación:

mixin template A(){ 

    alias Matrix!(3, 3) Matrix3x3; 

    static Matrix3x3 computeSomeMatrix(){ } 

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

Para corregir el error, necesito cambiar m a un no-ref, pero eso significa que las matrices se copiará cada vez que se llame al inverse(). ¿Qué debo hacer?

+0

¿O simplemente tiene las dos variantes ref y no ref 'inverse()'? – DejanLekic

+1

¿Cuál es el error exacto que está obteniendo? 'ref' debería funcionar en tiempo de compilación, es probable que sea otra cosa lo que estás haciendo lo que está causando. – Robert

+4

¿Has probado 'auto ref'? –

Respuesta

4

Veo una de dos opciones. Uno, crea una versión que toma un valor r. Frecuentemente es molesto cuando una función no funciona con valores r de todos modos. Una envoltura simple es todo lo que necesita:

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

tener cuidado de que la const-dad de los parámetros coincide sin embargo, o que va a conseguir una recursión infinita.

Sin embargo, una mejor solución sería usar auto ref. Esto es para lo que fue creado.

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

El compilador utilizará entonces ref cuando sea apropiado y no ref cuando sea apropiado sin tener que preocuparse por ello.

Cuestiones relacionadas