Недавно я узнал о спецификаторе хранилища Union для типов данных - особенно для использования матрицы преобразования OpenGL / DirectX, так как я не хочу продолжать использовать устаревшие функции gluLookAt, gluOrtho и различные функции MatrixStack фиксированнойФункциональный конвейер.Это было потрясающе, и недавно мне было очень весело создавать базовый класс матрицы преобразования 4x4, внутренние данные которого упакованы в единое целое, чтобы обеспечить различные способы доступа к данным в матрице.Проблема в том, что я хочу создать способ агрегирования / доступа к данным по их столбцам без необходимости выполнять какие-то странные функции
float* Column(int index);
.Я знаю, что C ++ хранит свои данные в форме строк, так как мне обеспечить доступ к столбцам?Там ???в приведенной ниже матричной декларации данных о том, где я потерялся.
//#define ROW_EFFIN_MAJOR
union {
struct {
#ifdef ROW_EFFIN_MAJOR
// Eat one of several nasty things, OpenGL :|
float m11, m12, m13, m14,
m21, m22, m23, m24,
m31, m32, m33, m34,
m41, m42, m43, m44;
#else
float m11, m21, m31, m41,
m12, m22, m32, m42,
m13, m23, m33, m43,
m14, m24, m34, m44;
#endif
};
float m[16];
// Use at your own risk: m[1] COLUMNMAJOR is not the same as m[1] ROWMAJOR
// Rows!
union MatrixRow {
struct {
float r1, r2, r3, r4;
};
float r[4];
} row[4];
// .... Columns...?
union MatrixColumn {
// TODO:
// Set Union
// Column Access ?
// ???
// Profit
} col[???];
};
Любые советы, советы, рекомендации или даже помощь были бы хорошими.В идеале я хотел бы получить доступ к столбцам по col [0] .c1 или просто по col [0] .c (c - это число с плавающей точкой [4]).Однако, если этот идеал должен быть убит за большую справедливость доступа к столбцам (хотя, склоняясь к не-функции, потому что я могу сделать это с помощью специальной структуры и функции. Это просто менее удобно и немного медленнее, чем доступданные напрямую через члена данных).
Я потратил немало времени, пытаясь связать это с google-fu, но я не могу понять, как создать несмежный союз.