Verwenden von C ++ - Vorlagen mit C-Strukturen für die Introspektion?

Ich arbeite in C ++ für eine Firma, die alles andere in C geschrieben hat (die Verwendung von C ist für mich keine Option :(). Sie haben eine Reihe von Datenstrukturen, die SEHR ähnlich sind (dh sie haben alle Felder) wie "Name", "Adresse" usw. Aber aus irgendeinem Grund gibt es keine gemeinsame Struktur, auf der sie alles andere aufbauen (macht alles zur Hölle) Analyse dieser Strukturen, die sich im Speicher befinden, und durchgehend in eine Tabelle Nicht schlecht, aber die Tabelle muss Einträge für alle Felder aller Variablen enthalten, auch wenn sie das Feld nicht haben (Struktur b darf Feld "Latenz" haben, aber Struktur a nicht - in der Tabelle muss der Eintrag für jede Instanz von a einen leeren Eintrag für "Latenz" haben.

Meine Frage ist also, gibt es eine Möglichkeit, zur Laufzeit zu bestimmen, ob eine Struktur, die an eine Vorlagenfunktion übergeben wurde, ein bestimmtes Feld hat? Oder muss ich ein Makro für schwarze Magie schreiben, das das für mich erledigt? (Das Problem ist im Grunde, dass ich keine Template-Spezialisierung verwenden kann)

Vielen Dank! Bei Fragen stehen wir Ihnen gerne zur Verfügung!

Hier ist ein Ausschnitt dessen, was ich dachte ...

struct A
{
  char name[256];
  int index;
  float percision;
};

struct B
{
  int index;
  char name[256];
  int latency;
};

/* More annoying similar structs... note that all of the above are defined in files that were compiled as C - not C++ */

struct Entry
{
  char name[256];
  int index;
  float percision;
  int latency;
  /* more fields that are specific to only 1 or more structure */
};

template<typename T> struct Entry gatherFrom( T *ptr )
{
  Entry entry;

  strcpy( entry.name, ptr->name, strlen( ptr->name ) );
  entry.index = ptr->index;
  /* Something like this perhaps? */
  entry.percision = type_contains_field( "percision" ) ? ptr->percision : -1;
}

int main()
{
  struct A a;
  struct B b;

  /* initialization.. */

  Entry e  = gatherFrom( a );
  Entry e2 = gatherFrom ( b );

  return 0;
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage