Faire réellement la démonstration du code pour que cela fonctionne en C est un peu trop impliqué pour un post SO. Mais expliquer le concept de base est faisable.
Ce que vous créez vraiment ici est un système de sac de propriété de modèle. La seule chose dont vous aurez besoin pour continuer est une structure assiociative comme une table de hachage. Je dirais aller avec std :: map, mais vous avez mentionné que c'était une solution C seulement. Par souci de discussion, je vais supposer que vous avez une sorte de hashtable disponible. L'appel "create_struct" devra renvoyer une structure qui contient un pointeur sur une hashtable qui rend const char*
essentiellement à size_t. Cette carte définit ce dont vous avez besoin pour créer une nouvelle instance de la structure.
La méthode "insance" créera essentiellement une nouvelle table de hachage avec un nombre égal de membres comme table de hachage de gabarit. Laissons l'évasion paresseuse à la fenêtre pendant une seconde et supposons que vous créez tous les membres à l'avant. La méthode devra faire une boucle sur la table de hachage du gabarit en ajoutant un membre pour chaque entrée et en plaçant un morceau de mémoire de la taille spécifiée.
L'implémentation de instance_get_member fera simplement une recherche dans la carte par son nom. La signature et le modèle d'utilisation devront cependant changer. C ne prend pas en charge les modèles et doit choisir un type de retour commun pouvant représenter toutes les données. Dans ce cas, vous devrez choisir void*
car c'est ainsi que la mémoire devra être stockée.
void* instance_get_member(any_struct_instance* inst, const char* name);
Vous pouvez faire un peu mieux en ajoutant une macro envil pour simuler des modèles
#define instance_get_member2(inst, name, type) \
*((type*)instance_get_member((inst),(name)))
...
int i = instance_get_member2(pInst,"a", int);
Il n'a pas besoin d'être exactement la même API. – user94405