Une itération sur une struct en C++
J'ai une structure
typedef struct A
{
int a;
int b;
char * c;
}aA;
Je veux effectuer une itération sur chaque une de chaque membre de la structure et de l'impression de sa valeur. Quelque chose comme:
void print_struct_value(struct *A)
{
for each member of struct A
cout << "struct name . member name" << "value";
}
Comment cela peut-il être fait en C++ ??
- Commencer avec quelque chose de plus simple: comment voulez-vous imprimer le
a
domaine de l'A
? - Votre échantillon ressemble à archaïque c. Dans ma réponse j'ai, dans une note, aplanir ces endroits.
- Je ne peux pas voir une utilisation de ce moins que le champs de la structure de données sont indéterminé jusqu'à ce que l'exécution. Et dans ce cas typedef struct n'est pas la bonne façon d'aller sur ce que vous essayez d'accomplir.
- En C++14, il est devenu possible, voir cette conférence: CppCon 2016: C++14 Réflexions Sans Macros, Balisage, ni Externe de l'Outillage.. youtube.com/watch?v=abdeAew3gmQ
Vous devez vous connecter pour publier un commentaire.
Peut-être vous pouvez les cordes quelque chose ensemble à l'aide de Boost de Fusion/Phoenix:
Voir en direct sur Coliru!
De sortie:
Vous ne pouvez pas effectuer une itération sur un objet de données des membres. Vous pouvez utiliser
std::ostream
's flux opérateur d'insertion pour imprimer individuellement toutefois:Et, à l'intérieur:
De sortie:
Voici une démo.
A
) est un bon endroit pour chercher.struct A { ... };
ettypedef struct A { ... } A;
sont tous les deux d'accord, maistypedef struct { ... } A;
vous obtenez en difficulté.Il ya un couple de façons de le faire, mais vous devez utiliser des macros pour définir ou adapter la structure.
Vous pouvez utiliser le
REFLECTABLE
macro donné dans cette réponse pour définir la structure comme ceci:Et puis vous pouvez parcourir les champs et les imprimer chaque valeur comme ceci:
Une autre façon est d'adapter la structure comme une séquence de fusion (voir la documentation). Voici un exemple:
Vous pouvez ensuite les imprimer les champs et en utilisant ceci:
C++ ne prend pas en charge la réflexion hors de la boîte, de sorte que ce que vous demandez est impossible dans le langage de base.
Les différentes bibliothèques de tenter de fournir une telle fonctionnalité, généralement par vous faire inscrire vos champs par le biais de certaines méthodes ou des macros, qui sera derrière la scène pour les enregistrer dans une collection de quelque sorte, sur lequel vous pouvez effectuer une itération.
puis-je effectuer une itération sur les membres d'une struct en c++ standard?
Non, norme c++ ne fournit pas une méthode pour la réalisation de ce que vous demandez, vous "itérer" éléments d'un conteneur - vous ne pouvez pas effectuer une itération sur les membres d'un certain type.
"réflexion" (que ce type de fonction est le plus souvent évoquée n'est pas une partie de C++).
dans c++11 vous pouvez utiliser un
std::tuple<int,int,char*>
au lieu de votrestruct A
, il va stocker le même type d'éléments et est beaucoup plus facile à parcourir (à l'aide de certains modèle la magie).les éléments à ne pas avoir des noms allant de
'a'
à'c'
mais si vous souhaitez l'imprimer cette manière bien sûr, cela peut être accompli en quelques lignes de code supplémentaires.Pour accéder à un élément spécifique que vous allez utiliser
std::get<N> (your_tuple)
oùN
est une partie intégrante allant de 0 àstd::tuple_size<std::tuple<int,int,char*>>::value - 1
(ie. 2).Comme suggéré par @Paul je utiliser BOOST_FUSION_ADAPT_STRUCT avec une auto écrite for_each_member fonction :
Si tous les champs de la structure sont les mêmes, vous pouvez le faire