- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
#	define S_1(X,...)				\
	template<class T, int N>		\
	T X(const V<T, N>& v)			\
	{								\
		return v.X;					\
	}
#	define S_2(X,Y,...)				\
	template<class T, int N>		\
	V<T, 2> X##Y(const V<T, N>& v)	\
	{								\
		return V<T, 2>(v.X, v.Y);	\
	}
#	define S_3(X,Y,Z,...)				\
	template<class T, int N>			\
	V<T, 3> X##Y##Z(const V<T, N>& v)	\
	{									\
		return V<T, 3>(v.X, v.Y, v.Z);	\
	}
#	define S_4(X,Y,Z,W,...)					\
	template<class T, int N>				\
	V<T, 4> X##Y##Z##W(const V<T, N>& v)	\
	{										\
		return V<T, 4>(v.X, v.Y, v.Z, v.W);	\
	}
#	define S_E(S, X, Y, Z)	\
	S(x, X, Y, Z);S(y, X, Y, Z);S(z, X, Y, Z);S(w, X, Y, Z);S(O, X, Y, Z);S(I, X, Y, Z);
#	define S_E1(E, S, Z, W)	\
	E(S, x, Z, W);			\
	E(S, y, Z, W);			\
	E(S, z, Z, W);			\
	E(S, w, Z, W);			\
	E(S, O, Z, W);			\
	E(S, I, Z, W);
#	define S_E2(E, S, W)	\
	S_E1(E, S, x, W);		\
	S_E1(E, S, y, W);		\
	S_E1(E, S, z, W);		\
	S_E1(E, S, w, W);		\
	S_E1(E, S, O, W);		\
	S_E1(E, S, I, W);
#	define S_E3(E, S)	\
	S_E2(E, S, x);		\
	S_E2(E, S, y);		\
	S_E2(E, S, z);		\
	S_E2(E, S, w);		\
	S_E2(E, S, O);		\
	S_E2(E, S, I);
	S_E1(S_E, S_2, void, void);
	S_E2(S_E, S_3, void);
	S_E3(S_E, S_4);
// Где-то выше
template<class T, int N>
struct V;
template<class T>
struct V<T, 2>
{
	V(T x, T y) : x(x), y(y) {}
	T x,y;
	T O = 0;
	T I = 1;
};
template<class T>
struct V<T, 3>
{
	V(T x, T y, T z) : x(x), y(y), z(z) {}
	T x,y,z;
	T O = 0;
	T I = 1;
};
template<class T>
struct V<T, 4>
{
	V(T x, T y, T z, T w) : x(x), y(y), z(z), w(w) {}
	T x,y,z,w;
	T O = 0;
	T I = 1;
};
                                     
        
            Этот код рабочий и используется во многих местах моего проекта. 
Я его написал когда-то давно и уже забыл, как оно функционирует, но оно генерирует очень много (около 1.5k) функций.