Supposons que j'ai un objet avec de nombreux membres: existe une manière courte / concise de faire quelque chose comme: p> Au lieu d'accéder à chacun individuellement? P> Je pense que je pouvais les mettre dans un vecteur et utiliser un partagé_ptr code> 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. p> p>
6 Réponses :
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: p> 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? p> reconquérir et reconsidérer votre conception. P> P>
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. P>
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. p>
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;
Il est possible que ce que vous recherchez ici est le modèle 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: p> alors vous avez besoin d'accepter les fonctions dans toutes les classes qui vont être Visité: p> 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. P> P>
Il existe plusieurs solutions à ce sujet, contrairement à ce que les naysayers blabber, mais pas de manière intégrée. P>
C ++ Prise en charge d'un type d'introspection limité, à la compilation: vous pouvez vérifier les paramètres de modèle. P>
Utilisation de Cela nécessite un peu de modèle méta-programmation. P> boost.Tupple code> ou
boost.fusion code> (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). P>
Aimé cette solution. Posté le code détaillé ici: C ++ ITERE dans le champ de struct imbriqué avec Boost Fusion Adapt_struct
C'est ma façon de faire ce que vous voulez réaliser dans
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.