Фактически демонстрация кода для этой работы на C слишком сложна для SO сообщения. Но объяснение основной концепции выполнимо.
То, что вы действительно создаете здесь, это система шаблонных пакетов свойств. Единственное, что вам понадобится для продолжения работы, - это некоторая ассоциативная структура, такая как хеш-таблица. Я бы сказал, что идти с std :: map, но вы упомянули, что это было решение только для Си. Ради обсуждения я просто собираюсь предположить, что у вас есть какая-то хеш-таблица.
Вызову create_struct нужно будет вернуть структуру, которая содержит указатель на хеш-таблицу, которая делает const char*
практически равным size_t. Эта карта определяет, что вам нужно для создания нового экземпляра структуры.
Метод "insance" по сути создаст новую хеш-таблицу с таким же количеством членов, как у хеш-таблицы шаблона. Давайте на секунду выбросим ленивое измышление и предположим, что вы создали всех участников заранее. Метод должен будет зацикливаться на хеш-таблице шаблона, добавляя член для каждой записи и malloc'ing кусок памяти указанного размера.
Реализация instance_get_member просто сделает поиск по карте по имени. Хотя подпись и модель использования должны будут измениться. C не поддерживает шаблоны и должен выбрать общий тип возврата, который может представлять все данные. В этом случае вам нужно будет выбрать void*
, поскольку именно так будет необходимо хранить память.
void* instance_get_member(any_struct_instance* inst, const char* name);
Вы можете сделать это немного лучше, добавив макрос envil для имитации шаблонов
#define instance_get_member2(inst, name, type) \
*((type*)instance_get_member((inst),(name)))
...
int i = instance_get_member2(pInst,"a", int);