Ik ben - als uit de hand gelopen hobby - bezig met het schrijven van een game engine in C++11 (is een project wat een lange tijd gaat duren, dus wil graag op de toekomst voorbereid zijn), met o.a. een uitgebreide math library. Nu kom ik alleen door mijn eigen perfectionisme/purisme in de knoop, en heb ik het volgende dilemma:
Ik gebruik meerdere vector dimensies, (2d, 3d, 4d, etc), welke van verschillende type kunnen zijn (float, int, etc). Deze delen allemaal het zelfde interne mechaisme. Ik heb hiervoor één template gemaakt,
welke vervolgens wordt getypedef'd voor de juiste situatie. Alleen wil ik het ook kunnen gebruiken via public properties, dus vector.x, vector.y, etc. in plaats van vector [0], vector [1], etc. Maar intern sla ik alles op in een array met de grote van de dimensie van de vector.
Ik heb twee oplossingen bedacht, maar ik kom er zelf niet goed uit welke oplossing de 'beste' is.
Even samengevat komt het er dus op neer:
- Oplossing 1, 'container' class met Union struct, publieke variable.
- Oplossing 2, VectorBase class inherit, en reference methods.
Persoonlijk lijkt oplossing 1 mij het meest flexibele, en meest 'nette' (hoewel ze allebei vrij vies zijn volgens mij.) Ik zou graag jullie mening willen horen, of misschien heb je een beter/nettere oplossing.
Ik gebruik meerdere vector dimensies, (2d, 3d, 4d, etc), welke van verschillende type kunnen zijn (float, int, etc). Deze delen allemaal het zelfde interne mechaisme. Ik heb hiervoor één template gemaakt,
welke vervolgens wordt getypedef'd voor de juiste situatie. Alleen wil ik het ook kunnen gebruiken via public properties, dus vector.x, vector.y, etc. in plaats van vector [0], vector [1], etc. Maar intern sla ik alles op in een array met de grote van de dimensie van de vector.
Ik heb twee oplossingen bedacht, maar ik kom er zelf niet goed uit welke oplossing de 'beste' is.
C++: Oplossing 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| template <typename _Component, int _Dimension> class VectorContainer { public: _Component components [_Dimension]; }; template <typename _Component, int _Dimension, typename _Container = VectorContainer <_Component, _Dimension>> class Vector : public _Container { // knip, bevat o.a. variadic constructors/methods, zoals: template <typename ... _Variadic> Vector (const _Component x, const _Component y, const _Variadic ... components); explicit Vector (const _Component (&components) [_Dimension]); }; template <typename _Component> class Vector2Container { public: union { _Component components [2]; struct { _Component x; _Component y; }; }; }; typedef Vector2 <double, 2, Vector2Container <float>> Vector2d; typedef Vector2 <float, 2, Vector2Container <float>> Vector2f; template <typename _Component> class Vector3Container { public: union { _Component components [3]; struct { _Component x; _Component y; _Component z; // .. etc }; }; }; // bijv. Vector2f vect (5.0f, -1.0f); vect.x = 1.0f; |
C++: Oplossing 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| template <typename _Component, int _Dimension> class VectorBase { // knip }; template <typename _Component> class Vector2 : public VectorBase <_Component, 2> { public: // inherit constructors _Component & x (); _Component & y (); }; typedef Vector2 <float> Vector2f; // bijv. Vector2f vect (-9.0f, 5.3f); vect.x() = 1.0f; // vies?! |
Even samengevat komt het er dus op neer:
- Oplossing 1, 'container' class met Union struct, publieke variable.
- Oplossing 2, VectorBase class inherit, en reference methods.
Persoonlijk lijkt oplossing 1 mij het meest flexibele, en meest 'nette' (hoewel ze allebei vrij vies zijn volgens mij.) Ik zou graag jullie mening willen horen, of misschien heb je een beter/nettere oplossing.
[ Voor 0% gewijzigd door Creepy op 30-12-2012 17:21 . Reden: Dilemma is met dubbel m ;) ]