Maison > développement back-end > C++ > Pouvez-vous parcourir dynamiquement les membres de structure et de classe en C ?

Pouvez-vous parcourir dynamiquement les membres de structure et de classe en C ?

Susan Sarandon
Libérer: 2024-10-30 14:11:03
original
1041 Les gens l'ont consulté

  Can You Dynamically Traverse Struct and Class Members in C  ?

Exploration itérative des membres de structure et de classe

En C , est-il possible de parcourir une structure ou une classe et de découvrir tous ses membres ? Considérez les exemples suivants :

<code class="cpp">struct a
{
  int a;
  int b;
  int c;
};

class b
{
  public:
    int a;
    int b;
  private:
    int c;
};</code>
Copier après la connexion

Est-il possible de parcourir ces structures et d'imprimer des instructions telles que "La structure a a un int nommé a, b, c" ou "La classe b a un int nommé a, b, c"?

Solution

Pour y parvenir, vous pouvez utiliser des macros ou adapter la structure comme une séquence de fusion.

Méthode 1 : Macro REFLECTABLE

Définissez la structure à l'aide de la macro REFLECTABLE comme indiqué ci-dessous :

<code class="cpp">struct A
{
    REFLECTABLE
    (
        (int) a,
        (int) b,
        (int) c
    )
};</code>
Copier après la connexion

Ensuite, parcourez les champs et imprimez chaque valeur :

<code class="cpp">struct print_visitor
{
    template<class FieldData>
    void operator()(FieldData f)
    {
        std::cout << f.name() << "=" << f.get() << std::endl;
    }
};

template<class T>
void print_fields(T &amp; x)
{
    visit_each(x, print_visitor());
}

A x;
print_fields(x);</code>
Copier après la connexion

Méthode 2 : Adaptation de la séquence de fusion

Adapter la structure en tant que séquence de fusion :

<code class="cpp">struct A
{
    int a;
    int b;
    int c;
};

BOOST_FUSION_ADAPT_STRUCT
(
    A,
    (int, a)
    (int, b)
    (int, c)
)</code>
Copier après la connexion

Imprimez les champs en utilisant cette approche :

<code class="cpp">struct print_visitor
{
    template<class Index, class C>
    void operator()(Index, C &amp; c)
    {

        std::cout << boost::fusion::extension::struct_member_name<C, Index::value>::call() 
                  << "=" 
                  << boost:::fusion::at<Index>(c) 
                  << std::endl;
    }
};


template<class C>
void print_fields(C &amp; c)
{
    typedef boost::mpl::range_c<int,0, boost::fusion::result_of::size<C>::type::value> range;
    boost::mpl::for_each<range>(boost::bind<void>(print_visitor(), boost::ref(c), _1));
}</code>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal