In veel van mijn methods werk ik apart op de x, y of z component van vector achtige structs, waardoor ik met veel code duplicatie zou zitten, bvb:
CoolClass::processEveryX()
CoolClass::processEveryY()
CoolClass::processEveryZ()
Niet wat je wil dus, dus ik dacht dit met templates op te lossen om zo at compile time de juiste functies te krijgen.
Wat ik nu heb, en het ziet er naar uit dat het alleszins een oplossing is:
Nu is de vraag natuurlijk, is er een simpelere manier om zaken als deze te implementeren? Want met het groen achter mijn oren heb ik het gevoel dat ik misschien wel een oplossing heb, maar een die misschien veel beter kan.
edit: een vereiste is natuurlijk dat de compiler de Selector::select() kan wegwerken en ik dus zonder overhead aan VectorType.x kom ipv dat er nog een call tussenzit.
CoolClass::processEveryX()
CoolClass::processEveryY()
CoolClass::processEveryZ()
Niet wat je wil dus, dus ik dacht dit met templates op te lossen om zo at compile time de juiste functies te krijgen.
Wat ik nu heb, en het ziet er naar uit dat het alleszins een oplossing is:
C++:
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
| struct SelectX{ template<class Vector> static auto select(Vector& vec) -> decltype(vec.x)& { return vec.x; } }; // struct SelectY { .... // enz ... struct XVec3 { float x; float y; }; template<class Selector, class Vector> void selectTest(Vector& vec){ auto& t = Selector::select(vec); } void test() { XVec3 test; selectTest<SelectX>(test); } |
Nu is de vraag natuurlijk, is er een simpelere manier om zaken als deze te implementeren? Want met het groen achter mijn oren heb ik het gevoel dat ik misschien wel een oplossing heb, maar een die misschien veel beter kan.
edit: een vereiste is natuurlijk dat de compiler de Selector::select() kan wegwerken en ik dus zonder overhead aan VectorType.x kom ipv dat er nog een call tussenzit.
[ Voor 8% gewijzigd door Bob op 22-04-2010 11:04 ]