Создание обобщенной карты ресурсов без использования строк? - PullRequest
0 голосов
/ 16 марта 2020

Давайте предположим, что я хочу создать объект, который будет содержать некоторые произвольные данные.

// Pseudocode
class MyContainer {
    map<key, pair<void*, size>>;
}

Ключ в этом случае также определяет тип данных, хранящихся в пустоте * (например, изображение, структура какой-то, может быть, даже функция).

Самый общий способ разобраться с этим - это получить ключ в виде строки. Тогда вы можете положить на землю все, что захотите, и тогда вы можете просто прочитать это. В качестве глупого примера ключ может быть просто:

"I am storing a png image and the source file was at location/assets/image.png and today is sunday".

, т.е. вы можете кодировать все, что захотите. Это однако медленно. Гораздо более быстрой альтернативой является использование перечислителей, и тогда ваши ключи будут IMAGE, HASHMAP, FUNCTION, THE_ANSWER_TO_LIFE ...

Однако для этого необходимо знать каждый отдельный случай, с которым вам нужно разобраться заранее, и создайте для него перечислитель вручную (это утомительно и не очень расширяемо).

Есть ли компромисс, который можно сделать? то есть что-то, что использует только один ключ, но быстрее, чем строки и более расширяемо, чем перечисления?

Редактировать: Точный вариант использования, для которого я пытаюсь использовать это, является обобщенным хранилищем для рендеринга данных. Это включает в себя изображения, буферы вершин, объем c данных, информацию об освещении ... или любую другую мыслимую вещь, которая может вам понадобиться.

Единственный известный мне способ создания «абсолютного полиморфизма» (т.е. представлять буквально любую форму мыслимых данных) использовать пустые указатели и полагаться на алгоритмы для понимания данных.

Пример:

Скажем, наш ключ - это строка JSON, где ключом каждого элемента является имя поля в компактной структуре и значением является смещение в байтах.

Например,

  {
       m_field1: 0,
       m_field2: 32,
       m_field3: 128,
   }

Затем для доступа к любому из элементов в пустоте * все, что вам нужно сделать, это сделать манипулирование символами для получения числа, а затем ptr + offset.

Вы можете сделать то же самое с набором уникальных идентификаторов (перечислений) и связанных функций, которые получают поля на основе идентификатора (жестко закодированный подход).

Надеюсь, это сделает вопрос менее ясным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...