Давайте предположим, что я хочу создать объект, который будет содержать некоторые произвольные данные.
// 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
.
Вы можете сделать то же самое с набором уникальных идентификаторов (перечислений) и связанных функций, которые получают поля на основе идентификатора (жестко закодированный подход).
Надеюсь, это сделает вопрос менее ясным.