¿Usando plantillas de C ++ con estructuras en C para la introspección?

Estoy trabajando en C ++ para una empresa que tiene todo lo demás escrito en C (usar C no es una opción para mí :(). Tienen una serie de estructuras de datos que son MUY similares (es decir, todas tienen campos) como "nombre", "dirección", etc. Pero, por el motivo que sea, no existe una estructura común que usen para basar todo lo demás (hace el infierno cualquier cosa). De todos modos, necesito hacer un sistema completo El análisis de estas estructuras que están en la memoria y, a través de todo, en una tabla. No está mal, pero la tabla debe incluir entradas para todos los campos de todas las variables, incluso si no tienen el campo (la estructura b puede tiene el campo "latencia", pero la estructura no, en la tabla la entrada para cada instancia de debe tener una entrada vacía para "latencia".

Entonces, mi pregunta es, ¿hay una manera de determinar en tiempo de ejecución si una estructura que se ha pasado a una función de plantilla tiene un campo específico? ¿O tendré que escribir alguna macro de magia negra que lo haga por mí? (El problema es básicamente que no puedo usar la especialización de plantillas)

¡Gracias! Si tiene alguna pregunta, por favor no dude en preguntar!

Aquí hay un fragmento de lo que estaba pensando ...

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;
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta