Я не уверен, возможно ли это вообще в стандарте C ++, поэтому, возможно ли это сделать, может быть второстепенным способом поставить мой вопрос.
У меня есть эти двоичные данные, которые я хочучитать и создавать заново, используя структуры.Эти данные изначально создаются как поток с контентом, добавляемым в буфер, поле за полем за раз;ничего особенного в этом нет.Я мог бы просто прочитать это как поток, так же, как это было написано.Вместо этого я просто хотел посмотреть, возможно ли позволить компилятору выполнить для меня математику, и вместо этого реализовать двоичные данные в виде структуры данных.
Поля двоичных данных имеют предсказуемый порядок, который позволяетэто должно быть представлено как тип данных, проблема, с которой я сталкиваюсь, связана с глубиной и переменной длиной повторяющихся полей.Я надеюсь, что приведенный ниже пример кода проясняет ситуацию.
Простой пример
struct Common {
int length;
};
struct Boo {
long member0;
char member1;
};
struct FooSimple : Common {
int count;
Boo boo_list[];
};
char buffer[1024];
int index = 15;
((FooSimple *)buffer)->boo_list[index].member0;
Расширенный пример
struct Common {
int length;
};
struct Boo {
long member0;
char member1;
};
struct Goo {
int count;
Boo boo_list[];
};
struct FooAdvanced : Common {
int count;
Goo goo_list[];
};
char buffer[1024];
int index0 = 5, index1 = 15;
((FooAdvanced *)buffer)->goo_list[index0].boo_list[index1].member0;
Примеры не должны быть связаны.Я повторно использовал некоторый код из-за недостатка креативности для уникальных имен.
Для простого примера в этом нет ничего необычного.Структура Boo имеет фиксированный размер, поэтому компилятор может просто выполнять вычисления, чтобы достичь поля member0.
Для продвинутого примера, насколько я могу судить по крайней мере, это не так тривиальнодела.Проблема, которую я вижу, состоит в том, что если я использую оператор селектора массива для выбора объекта Goo из встроенного массива Goo-элементов (goo_list), компилятор не сможет правильно выполнять вычисления смещения, если он не сделает некоторые предположения;возможно, предполагая, что все предшествующие Goo-элементы в массиве имеют нулевые Boo-элементы во встроенном массиве (boo_list) или какое-либо другое постоянное значение.Естественно, этого не произойдет.
Вопрос (ы):
- Какие существуют способы достижения вычислений смещения, которые должны быть выполненыкомпилятор, несмотря на то, что встроенные массивы имеют переменную длину?Если я что-то упустил, я думаю, что шаблоны не могут помочь вообще, из-за их природы во время компиляции.
- Возможно ли это даже достичь в C ++?
- Как вы справляетесь св случае создания экземпляра объекта FoodAdvanced путем подачи переменного числа элементов Goo и Boo в члены goo_list и boo_list соответственно?
- Если это невозможно, придется ли мне писать какой-нибудь код-обертку для обработкивместо расчетов?