Maison > développement back-end > C++ > Comment puis-je parcourir les membres de la structure et de la classe en C pour accéder à leurs noms et valeurs au moment de l'exécution ?

Comment puis-je parcourir les membres de la structure et de la classe en C pour accéder à leurs noms et valeurs au moment de l'exécution ?

Mary-Kate Olsen
Libérer: 2024-10-28 03:02:31
original
812 Les gens l'ont consulté

How can I iterate over struct and class members in C   to access their names and values at runtime?

Itération sur les membres d'une structure et d'une classe

En C , il est possible de parcourir les membres d'une structure ou d'une classe pour récupérer leurs noms et des valeurs. Voici quelques approches pour y parvenir :

Utilisation de macros

La macro REFLECTABLE peut être utilisée pour définir des structures qui permettent l'introspection. La macro définit les membres de la structure comme une liste de paires type-nom séparées par des virgules. Par exemple :

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

Une fois la structure définie, vous pouvez utiliser une fonction visiteur pour parcourir ses membres et imprimer leurs noms et valeurs :

<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 & x)
{
    visit_each(x, print_visitor());
}

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

Adapter les structures comme séquences de fusion

Une autre approche consiste à adapter la structure en tant que séquence de fusion à l'aide de la macro BOOST_FUSION_ADAPT_STRUCT. Cette macro définit les membres de la structure comme une séquence d'éléments avec le type et la valeur correspondants. Par exemple :

<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

Une fois la structure adaptée, vous pouvez utiliser une boucle de plage pour parcourir les membres et imprimer leurs noms et valeurs :

<code class="cpp">struct print_visitor
{
    template<class Index, class C>
    void operator()(Index, C & 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 & 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

Ces deux approches vous permettent pour introspecter les structures et les classes, donnant accès à leurs membres et à leurs valeurs au moment de l'exécution.

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