C++ Поля переменной длины в структурах

112
06 августа 2021, 02:20

Есть, например, такая структура:

struct FooStructure
{
    WORD Field1;
    WORD Field2;
    WORD Field3;
}

Все поля в ней имеют размер по 2 байта. Как поступить, если в процессе выполнения программы выяснилось, что для хранения значения в поле Field2 не хватает места и нужно не 2, а 4 байта (DWORD). При этом использовать DWORD сразу с запасом на такие случаи не вариант, т.к. данные, которые потом разбиваются на поля структуры, идут в памяти последовательно.

Если говорить конкретно, задача разобрать таблицы метаданных управляемых модулей .NET. Поскольку в этих таблицах в большом количестве используются индексы объектов разного типа в других потоках метаданных, а эти индексы могут быть 2х или 4х байтными, использовать структуры для обработки метаданных проблематично.

Answer 1

Тут я бы посоветовал 2 варианта.

1: Шаблоны - тут я думаю все понятно, какой тип нужен - такой и пихайте

template<typename T1, typename T2, typename T3>
struct FooStructure
{
    T1 Field1;
    T2 Field2;
    T3 Field3;
}

2: Указатели - что вам угодно - аллоцируйте память под это туда и пихайте)))

struct FooStructure
{
    void* Field1;
    void* Field2;
    void* Field3;
}

3: все поля сделать union

Union t {
    Type1 t1,
    Type2 t2
 };

C++17:

  1. Все поля сделать std::variant

  2. Все поля сделать сделать std::any

READ ALSO
Квадратные скобки в HTML

Квадратные скобки в HTML

Столкнулся с такой ситуациейПишу на Блогере статью

312
Как реализовать вывод видеофайла с сервера на сайт в Flask?

Как реализовать вывод видеофайла с сервера на сайт в Flask?

Имеется сервер и видео на немБэкенд представлен библиотекой Flask на Python

224
Построение окружности js

Построение окружности js

написал небольшой скрипт на js в котором небольшой круг описывает собой окружность, но на уровне точки окружности по оси x, круг начинает увеличивать...

239
алгоритм поиска номера элемента в списке

алгоритм поиска номера элемента в списке

Есть отсортированный по полю "продукт" список объектов следующего вида:

123