Die eigentliche Demonstration des C-Codes ist ein bisschen zu kompliziert für einen SO-Beitrag. Aber das Grundkonzept zu erklären, ist machbar.
Was Sie hier wirklich schaffen, ist ein schablonenhaftes Eigenschaftssacksystem. Die eine Sache, die Sie brauchen eine Menge, um dies zu halten, ist einige assoziative Struktur wie eine Hashtabelle. Ich würde sagen, gehen Sie mit std::map, aber Sie erwähnt dies war eine C nur Lösung. Für die Diskussion gehe ich einfach davon aus, dass Sie eine Art von Hashtable zur Verfügung haben.
Der "create_struct"-Aufruf muss eine Struktur zurückgeben, die einen Zeiger auf eine Hashtabelle enthält, so dass const char*
im Wesentlichen zu einer size_t. Diese Zuordnung definiert, was Sie benötigen, um eine neue Instanz der Struktur zu erstellen.
Die "insance"-Methode wird im Wesentlichen eine neue Hashtabelle mit der gleichen Anzahl von Mitgliedern wie die Vorlage Hashtabelle erstellen. Werfen wir die faule Vermutung für eine Sekunde aus dem Fenster und nehmen an, dass Sie alle Mitglieder im Voraus erstellen. Die Methode muss eine Schleife über die Vorlage hashtable Hinzufügen eines Mitglieds für jeden Eintrag und malloc'ing ein Speicherchunk der angegebenen Größe.
Die Implementierung von instance_get_member führt einfach eine Suche in der Map nach Namen durch. Die Signatur und das Verwendungsmuster müssen jedoch geändert werden. C unterstützt keine Templates und muss einen allgemeinen Rückgabetyp wählen, der alle Daten repräsentieren kann. In diesem Fall müssen Sie Folgendes wählen void*
da der Speicher auf diese Weise gespeichert werden muss.
void* instance_get_member(any_struct_instance* inst, const char* name);
Sie können dies noch etwas verbessern, indem Sie ein envil-Makro hinzufügen, um Vorlagen zu simulieren
#define instance_get_member2(inst, name, type) \
*((type*)instance_get_member((inst),(name)))
...
int i = instance_get_member2(pInst,"a", int);