web-dev-qa-db-fra.com

Comment comparer des structures génériques en C ++?

Je veux comparer les structures de manière générique et j'ai fait quelque chose comme ça (je ne peux pas partager la source réelle, alors demandez plus de détails si nécessaire):

template<typename Data>
bool structCmp(Data data1, Data data2)
{
  void* dataStart1 = (std::uint8_t*)&data1;
  void* dataStart2 = (std::uint8_t*)&data2;
  return memcmp(dataStart1, dataStart2, sizeof(Data)) == 0;
}

Cela fonctionne principalement comme prévu, sauf que parfois, il retourne false même si les deux instances de structure ont des membres identiques (j'ai vérifié avec le débogueur Eclipse). Après quelques recherches, j'ai découvert que memcmp pouvait échouer en raison du remplissage de la structure utilisée.

Existe-t-il une manière plus appropriée de comparer la mémoire qui est indifférente au remplissage? Je ne suis pas en mesure de modifier les structures utilisées (elles font partie d'une API que j'utilise) et les nombreuses structures différentes utilisées ont des membres différents et ne peuvent donc pas être comparées individuellement de manière générique (à ma connaissance).

Edit: je suis malheureusement coincé avec C++ 11. J'aurais dû le mentionner plus tôt ...

13
Fredrik Enetorp

Je crois que vous pourrez peut-être baser une solution sur le vaudou merveilleusement sournois d'Antony Polukhin dans le magic_get bibliothèque - pour les structures, pas pour les classes complexes.

Avec cette bibliothèque, nous sommes en mesure d'itérer les différents champs d'une structure, avec leur type approprié, dans un code purement général. Antony a utilisé cela, par exemple, pour pouvoir diffuser des structures arbitraires vers un flux de sortie avec les types corrects, de manière complètement générique. Il va de soi que la comparaison pourrait également être une application possible de cette approche.

... mais vous auriez besoin de C++ 14. Au moins, c'est mieux que le C++ 17 et les suggestions ultérieures dans d'autres réponses :-P

0
einpoklum