C'est un C++ suivi pour une autre question de la mienne
Dans les vieux jours de pré-ISO C, le code suivant aurait surpris personne:
struct Point {
double x;
double y;
double z;
};
double dist(struct Point *p1, struct Point *p2) {
double d2 = 0;
double *coord1 = &p1->x;
double *coord2 = &p2->x;
int i;
for (i=0; i<3; i++) {
double d = coord2[i] - coord1[i]; // THE problem
d2 += d * d;
}
return sqrt(d2);
}
Malheureusement, cette problématique de la ligne utilise l'arithmétique des pointeurs (p[i]
étant , par définition, *(p + i))
en dehors de tout tableau qui est explicitement interdit par la norme. Projet de 4659 pour C++17 dit dans 8,7 [expr.ajouter]:
Si l'expression de P points à l'élément x[i] d'un objet de tableau x avec n éléments, les expressions de P + J et J + P (où J est la valeur de j) point à l' (éventuellement) hypothétique) de l'élément x[i + j] si 0 <= i + j <= n; autrement, le comportement est indéfini.
Et la (non normatif) note 86 rend encore plus explicite:
Un objet qui n'est pas un élément de tableau est considéré comme appartenant à un seul élément de tableau à cet effet. Un pointeur après le dernier élément d'un tableau x de n éléments est considéré comme équivalent à un pointeur vers un hypothétique élément x[n] à cette fin.
L'on a accepté la réponse de la référencées question utilise le fait que le langage C accepte le type de beaucoup les jeux de mots par le biais des syndicats, mais je n'ai jamais pu trouver l'équivalent dans la norme C++. Donc je suppose qu'une union contenant un anonyme struct membre et un tableau entraînerait Undefined Behaviour
en C++ - elles sont différentes langues...
Question:
Ce pourrait être une manière conforme à itérer à travers les membres d'une structure, comme s'ils étaient membres d'un tableau en C++? Je suis à la recherche d'une façon de courant (C++17) versions, mais les solutions pour les versions plus anciennes sont aussi les bienvenus.
Avertissement:
Il est évident qu'elle ne s'applique qu'à des éléments de même type, et le rembourrage peut être détecté avec un simple assert
comme le montre cette autre question, donc, de rembourrage, l'alignement, et les types mixtes ne sont pas mon problème ici.