- 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) функций.