Я хотел бы создать векторную структуру в 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
Позже я также хотел бы добавить такие вещи, как u = v * u
и т. Д. Но вышеприведенное пока подойдет.
Вот как далеко я зашёл:
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];
}
}
Теперь это в значительной степени заставляет это работать так, как я хотел, но я чувствую себя очень неуверенно относительно того, правильно ли это. Должно ли opAssign () возвращать какое-то значение?
Мне также интересно, действительно ли это так быстро, как только может быть? Я пытался добавить alias data[0] x;
и т. Д., Но это не работает. Есть идеи? Или это "как это делается"? Возможно, компилятор достаточно умен, чтобы выяснить, какие функции являются более или менее псевдонимами?