8
votes

C ++: itération à travers tous les membres d'un objet?

Supposons que j'ai un objet avec de nombreux membres: xxx

existe une manière courte / concise de faire quelque chose comme: xxx

Au lieu d'accéder à chacun individuellement?

Je pense que je pouvais les mettre dans un vecteur et utiliser un partagé_ptr pour le même effet, je me demandais simplement si dites, stimulez ou d'autres La bibliothèque populaire n'a pas quelque chose à faire cela automatiquement.


4 commentaires

Je ne pense vraiment pas que c'est une bonne idée. Si vous avez besoin de parcourir quelque chose, alors déclarez-le comme un conteneur itérable, ou pourquoi ne feriez-vous pas cela?


Découvrez la sérialisation de boost


C ++ n'a pas de réflexion. Cela signifie que ce n'est pas possible.


Par curiosité, comment cela serait-il même utile? Souvent, quand quelque chose est si fondamentalement impossible, c'est parce que cela n'aurait pas de sens en premier lieu.


6 Réponses :


12
votes

C ++ ne prend pas en charge la classe introspection, de sorte que vous ne pouvez donc pas itération sur tous les membres d'une classe comme celle-là - non sans avoir une fonction (écrite manuellement) qui compte sur tous les membres pour vous de toute façon.

Vous pourriez, dans Principe, ajoutez un membre de modèle comme: xxx

qui dit, je considérerais cela comme une conception brisée; Vous êtes allé et a exposé tous vos membres internes publiquement. Que se passe-t-il si vous en ajoutez une plus tard? Ou changer la sémantique d'un? Faire une valeur mise en cache qui est parfois obsolète? etc. De plus, que se passe-t-il si vous avez des membres qui n'hérent pas tous des mêmes types?

reconquérir et reconsidérer votre conception.


0 commentaires

-3
votes

Ceci n'est pas possible avec C ++, si vous avez vraiment vraiment besoin de cela, utilisez plutôt C #. Mais je doute sérieusement que tu fas.

Ayant dit que, sur la seule option que vous avez vraiment, c'est utiliser .NET et utiliser géré C ++ que les appels Microsoft grésent C ++ / CLI. Mais la mise en garde, votre classe doit être une «classe REF» gérée, ce qui signifie une classe gérée. Finalement, tout est compilé à MSIL et à la langue intermédiaire qui est agnostique linguistique. C'est le seul moyen de pouvoir utiliser la réflexion .NET sur elle à l'exécution pour découvrir les fonctions et les valeurs des membres. Cependant, même en utilisant .net, ce n'est pas aussi facile que vous avez décrit comment vous souhaitez l'utiliser ci-dessus. Un autre inconvénient à la réflexion est que c'est lent, donc si vous l'utilisez fortement, vous avez un mauvais design. La réflexion est belle dans cette option .NET l'utilise pour aider à sérialiser des types de données, ce qui rend la sérialisation XML très facile à utiliser.


0 commentaires

3
votes

C ++ peut faire quelque chose comme ceci, si vous jouez par ses règles et utilisez le métaprogrammation de modèle.

au lieu de stocker vos affaires dans une structure ou une classe, stockez-la dans un tuple: P>

typedef boost::tuple<AnotherClass, AnotherClass, YetAnotherClass> Example;


0 commentaires

0
votes

Il est possible que ce que vous recherchez ici est le modèle visiteur . Si vous avez un objet tel que vous décrivez, avec un certain nombre de champs de membre non triviaux, vous constatez que vous avez un certain nombre de fonctions différentes qui traversent cette structure de données de la même manière, le motif de visiteur peut être très utile pour réduire la quantité de duplication de code. Il n'est pas automatique, à travers, vous devez écrire les fonctions qui traversent tous les champs membres, mais vous ne devez le faire qu'une fois, et vous pouvez l'utiliser plusieurs fois avec différentes classes de visiteurs qui font différentes choses.

Le Le modèle de visiteur implique une écriture assez un peu de code, vous avez besoin d'une classe de base abstraite pour les visiteurs: xxx

alors vous avez besoin d'accepter les fonctions dans toutes les classes qui vont être Visité: xxx

et enfin, vous devez mettre en œuvre des classes de visiteurs concrets qui font le travail réel qui vous intéresse, ce qui permet généralement de recueillir des informations de la structure de données, de modifier les modifications. à la structure de données ou à des combinaisons des deux. Motif de visiteur de Google et vous trouverez beaucoup d'aide à ce sujet.


0 commentaires

6
votes

Il existe plusieurs solutions à ce sujet, contrairement à ce que les naysayers blabber, mais pas de manière intégrée.

C ++ Prise en charge d'un type d'introspection limité, à la compilation: vous pouvez vérifier les paramètres de modèle.

Utilisation de boost.Tupple ou boost.fusion (pour sa carte), vous pouvez en effet réaliser ce que vous souhaitez. Dans Boost.Fusion, vous avez même BOOST_FUSION_ADAPT_STRIST_STRUCT pour transformer une structure de base en une séquence de fusion (et ainsi l'itère).

Cela nécessite un peu de modèle méta-programmation.


1 commentaires

Aimé cette solution. Posté le code détaillé ici: C ++ ITERE dans le champ de struct imbriqué avec Boost Fusion Adapt_struct



0
votes

C'est ma façon de faire ce que vous voulez réaliser dans C ++ 11 . Il utilise tuple et modèles . Ce n'est pas court et concis, mais si vous enveloppez un somécode dans un fichier d'en-tête est acceptable. Il y a mon exemple compilable complet: xxx


0 commentaires