Издалека начну. Есть некий хитрый контейнер, который обходится итератором. Элементы контейнера - структура определенная юзером. В структуре может быть несколько полей (в идеале разных POD-типов, но можно ограничиться пока одним).
Теперь самое сложное - в разных элементах некоторых полей может вообще не быть, может быть просто поле типа T, а может быть небольшой массив (одномерный или двумерный), и это будет меняться в runtime. При этом накладные расходы на хранение всего этого безобразия должны быть минимальны, то есть решение вида
struct E{
std::vector<T> a;
std::vector<T> b;
std::vector<T> c;
...
};
заведомо не проходит, полей может быть много (десятки) и в большинстве элементов большей части может не быть. Кроме того желательна локальность данных.
Нужно:
-
Понять как это вообще можно сделать.
-
Хороший интерфейс для доступа ко всему этому.
-
Хороший интерфейс для задания структуры пользователем.
-
Желательно, но не необязательно - прикрутить к этому какую то интроспекцию, то есть что бы хранились типы полей и имена полей (как массив строк и sizeof-ов).
Пока что придумалось такое - в структуре заводится
std::vector<char> data; // тут лежат все данные
uint8_t sz[N][2]; // размеры полей как массивов
uint16_t off[N]; // смещения различных полей в data
где Т - число полей (в итоге расход 4 байта на поле - с этим как то можно жить) и для каждого поля name делаются функции
T& name(int i=0, j=0);
void resize_name(int szi, int szj, T defval=T());
и то и то делается макросами, то есть для юзера задание структуры выглядит как
struct E{
CELL_TABLE(10); // задаем N
ADD_FIELD(0, double, a); // номер поля, тип, имя
ADD_FIELD(1, float, b);
...
};
а доступ выглядит как
I->a() ... I->b(1) ... I->c(0,2) ...
если индекс вышел за пределы массива генерируется ошибка.
Вопросы:
-
какие тут подводные камни, что можно улучшить?
-
как это вообще называется (лучше назвать)?
-
как к этому малой кровью прикрутить интроспекцию? То есть я хочу иметь возможность в runtime снаружи узнать все типы полей, имена полей, размеры типов полей.
cast KennyMinigun , hobbit;-)