Ich denke auch, dass sowohl std::vector, als auch If-Abfragen, als auch Exceptions komplett unangebracht für Komponentenzugriff eines 3D-Vektors sind und nur unnötigen Overhead mit sich bringen.
Jap
Der operator[] ist ein Streitfall. Kommt es bei dir jemals vor, dass du kein Literal (also eine Zahl im Code) übergibst, sondern den Wert des Indizes berechnest oder in einer Variable speicherst? Falls nicht, kannst du geradesogut statt vector[0] immer vector.x schreiben. Ich würde sprechende Namen bevorzugen und tendiere daher eher zu drei separaten öffentlichen Membervariablen.
Wenn man irgendwelche Algorithmen implementiert die auf Meshes arbeiten hat man sehr sehr schnell den Fall dass man über Indizes auf Komponenten zugreifen will (z.B. wenn man Vertices nach einer Komponente sortieren will, beispielsweise um eine Baumstruktur darüber aufzubauen). Was die sprechenden Namen angeht würde ich mal sagen dass man da je nachdem von welchem Hintergrund man kommt für beide Varianten argumentieren kann, in der Mathematik ist es z.B. üblich (weil eigentlich korrekter) Vektorkomponenten über Indizes zu identifizeren.
Man kann sich (wie schon gesagt) ja aber auch was zusammenhacken was beide Varianten unterstützt:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
struct vector3d
{
union
{
struct
{
float x;
float y;
float z;
};
float c[3];
};
float operator [](int index) const { return c[index]; }
float& operator [](int index) { return c[index]; }
};
|
Ist halt nicht 100% sauberes C++ sollte aber mit den gängigen Compilern (MSVC/GCC) funktionieren.