edit : put in source marker
try this:
(it can be expanded to create a temporary dummy object to support lvalue swizzles too)
#include "stdafx.h"#include <iostream>using namespace std;#define xyzw GetSwizzle<0,1,2,3>()#define yzwx GetSwizzle<1,2,3,0>()#define zwxy GetSwizzle<2,3,0,1>()#define wxyz GetSwizzle<3,0,1,2>()//etc..#define wzyx GetSwizzle<3,2,1,0>()class vector4{ float tab[4];public: vector4(float x, float y, float z, float w) { tab[0] = x; tab[1] = y; tab[2] = z; tab[3] = w; } float & operator[](int index) { return tab[index]; } template<int a,int b, int c, int d> vector4 GetSwizzle() { return vector4(tab<A href='http://, tab, tab[c], tab[d]); <br></font><br> }<br>};<br><br><font color=blue>int</font> main(<font color=blue>int</font> argc, <font color=blue>char</font>* argv[])<br>{<br> vector4 vi(4,5,6,7);<br><br> <font color=gray>//vector4 v = vi.GetSwizzle<3,2,1,0>();<br></font><br> vector4 v = vi.wzyx;<br> cout << v[<font color=purple>0</font>] << ',' << v[<font color=purple>1</font>] << ',' << v[<font color=purple>2</font>] << ',' << v[<font color=purple>3</font>] << endl;<br> <font color=blue>char</font> cc;<br> cin >> cc;<br> <font color=blue>return</font> 0;<br>}<br></pre><!–ENDSCRIPT–> <br><br><SPAN CLASS=editedby>[edited by - janos on March 22, 2004 6:01:48 AM]</SPAN> <br><br><SPAN CLASS=editedby>[edited by - janos on March 22, 2004 6:10:52 AM]</SPAN>