Een tijdje geleden was ik geintereseerd geraakt om swizzling te implementeren in C++.
Ik weet dat er methoden zijn met templates die prima werken, maar die naar mijn mening niet zo'n mooie syntax hebben.
in GLSL kun je het volgende doen:
Dat wil ik dus nabootsen in C++. Na wat zoeken kwam ik uit bij ene Dwight en die had een implementatie die mij wel aansprak.
Met dat als basis ben ik verder gegaan en heb inmiddels een redelijk werkende opzet. Momenteel genereer ik de klasse met een klein programma, dit omdat er voor elke optie (xxx, xxy, xxz etc ) een member gemaakt moet worden. Op zich misschien niet zo elegant, maar dit is eenmalig en het stelt de gebruiker van de klasse vervolgens instaat om het GLSL voorbeeld van boven 1-op-1 over te nemen naar C++, terwijl het ook nog zeer efficiënt is.
Daarnaast is de klasse nu gemaakt op integers, maar dit kan natuurlijk relatief eenvoudig omgezet worden naar een template.
De basis van de klasse is als volgt:
Voor een punt met de waarden x=1, y=2, z=3 zijn de x en z members precies omgedraait in de member zyx.
De members z,y,x in de struct ZYX zou je ook kunnen lezen als 'eerste-, tweede- en derde member'.
Hierdoor kun je de volgende operator definiëren:
Waardoor het volgende mogelijk wordt*:
* constructor en assignment operator ontbreken, gaat om het idee
Zie hier voor een meer volledige versie van deze klasse
Nu gaat het mij om het implementeren van de benodigde operators. De huidige vermenigvuldiging operator is erg generiek, maar weer niet zo generiek dat deze geschikt is om
te ondersteunen.
Graag zou ik met jullie brainstormen hoe deze operators het beste geïmplementeerd kunnen worden
Ik weet dat er methoden zijn met templates die prima werken, maar die naar mijn mening niet zo'n mooie syntax hebben.
in GLSL kun je het volgende doen:
C++:
1
2
| vec3 a, b; a.xyz = b.xxy; |
Dat wil ik dus nabootsen in C++. Na wat zoeken kwam ik uit bij ene Dwight en die had een implementatie die mij wel aansprak.
Met dat als basis ben ik verder gegaan en heb inmiddels een redelijk werkende opzet. Momenteel genereer ik de klasse met een klein programma, dit omdat er voor elke optie (xxx, xxy, xxz etc ) een member gemaakt moet worden. Op zich misschien niet zo elegant, maar dit is eenmalig en het stelt de gebruiker van de klasse vervolgens instaat om het GLSL voorbeeld van boven 1-op-1 over te nemen naar C++, terwijl het ook nog zeer efficiënt is.
Daarnaast is de klasse nu gemaakt op integers, maar dit kan natuurlijk relatief eenvoudig omgezet worden naar een template.
De basis van de klasse is als volgt:
C++:
1
2
3
4
5
6
7
8
| union Point { int x, y, z; struct ZYX { int z,y,x; } zyx; } |
Voor een punt met de waarden x=1, y=2, z=3 zijn de x en z members precies omgedraait in de member zyx.
De members z,y,x in de struct ZYX zou je ook kunnen lezen als 'eerste-, tweede- en derde member'.
Hierdoor kun je de volgende operator definiëren:
C++:
1
2
3
4
| template < class A, class B > A operator * ( const A &a, const B &b ) { return A( a.x * b.x, a.y * b.y, a.z * b.z ); } |
Waardoor het volgende mogelijk wordt*:
C++:
1
2
| Point a( 1, 2, 3 ); Point b = a * a.zyx; |
* constructor en assignment operator ontbreken, gaat om het idee
Zie hier voor een meer volledige versie van deze klasse
Nu gaat het mij om het implementeren van de benodigde operators. De huidige vermenigvuldiging operator is erg generiek, maar weer niet zo generiek dat deze geschikt is om
C++:
1
| a.xy * b.xy |
te ondersteunen.
Graag zou ik met jullie brainstormen hoe deze operators het beste geïmplementeerd kunnen worden
oprecht vertrouwen wordt nooit geschaad