Je travaille en C++ pour une entreprise dont tout le reste est écrit en C (l'utilisation du C n'est pas une option pour moi :( ). Ils ont un certain nombre de structures de données qui sont TRÈS similaires (c'est-à-dire qu'ils ont tous des champs tels que "nom", "adresse", etc. Mais, pour une raison quelconque, il n'y a pas de structure commune sur laquelle ils se basent pour tout le reste (ce qui rend les choses infernales). Quoi qu'il en soit, j'ai besoin de faire une analyse de l'ensemble du système de ces structures qui sont en mémoire, et de tout regrouper dans une table. Pas trop mal, mais la table doit inclure des entrées pour tous les champs de toutes les variables, même si elles n'ont pas le champ (la struct b peut avoir le champ "latency", mais pas la struct a - dans la table, l'entrée pour chaque instance de a doit avoir une entrée vide pour "latency".
Ma question est donc la suivante : existe-t-il un moyen de déterminer, au moment de l'exécution, si une structure qui a été transmise à une fonction modèle possède un champ spécifique ? Je ne sais pas si je vais devoir écrire une macro magique qui le fera à ma place, mais je ne sais pas si je vais devoir écrire une macro magique qui le fera à ma place. (Le problème est essentiellement que je ne peux pas utiliser la spécialisation des modèles).
Merci de votre attention ! Si vous avez des questions, n'hésitez pas à les poser !
Voici un extrait de ce que je pensais...
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;
}