Me gustaría crear una estructura vectorial en D que funciona así:estructura vectorial rápida que permite [i] y .xyz-operaciones en D?
vec u, v;
vec w = [2,6,8];
v.x = 9; // Sets x
v[1] = w.y; // Sets y
u = v; // Should copy data
Más tarde también me gustaría añadir cosas como u = v * u
etc. Pero lo anterior va a hacer por ahora.
Esto es lo lejos que he llegado:
struct vec3f
{
float[3] data;
alias data this;
@property
{
float x(float f) { return data[0] = f; }
float y(float f) { return data[1] = f; }
float z(float f) { return data[2] = f; }
float x() { return data[0]; }
float y() { return data[1]; }
float z() { return data[2]; }
}
void opAssign(float[3] v)
{
data[0] = v[0];
data[1] = v[1];
data[2] = v[2];
}
}
Ahora bien, esto hace que sea más o menos funciona como yo quería, pero me siento muy seguro de si esto es "correcto". ¿Debería el opAssign() devolver algo de valor?
¿Me pregunto si esto es realmente tan rápido como puede ser? He intentado agregar alias data[0] x;
etc. pero eso no funciona. ¿Algunas ideas? ¿O es así "cómo se hace"? Tal vez el compilador es lo suficientemente inteligente como para descubrir que las funciones de propiedad son más o menos alias.
+1, tuve la misma idea de swizzling con opDispatch. Todavía estoy en las primeras etapas de D, por lo que mi solución probablemente no sea tan buena como podría ser. Sin embargo, ¡las cosas en tiempo de compilación que puedes hacer son alucinantes! – shambulator