"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-11-06
Parcourir:433

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 permettant 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 :

struct A
{
    REFLECTABLE
    (
        (int) a,
        (int) b,
        (int) c
    )
};

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

struct print_visitor
{
    template
    void operator()(FieldData f)
    {
        std::cout 
void print_fields(T & x)
{
    visit_each(x, print_visitor());
}

A x;
print_fields(x);

Adaptation des structures en tant que 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 :

struct A
{
    int a;
    int b;
    int c;
};

BOOST_FUSION_ADAPT_STRUCT
(
    A,
    (int, a)
    (int, b)
    (int, c)
)

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

struct print_visitor
{
    template
    void operator()(Index, C & c)
    {
        std::cout ::call() 
                  (c) 
                  
void print_fields(C & c)
{
    typedef boost::mpl::range_c::type::value> range;
    boost::mpl::for_each(boost::bind(print_visitor(), boost::ref(c), _1));
}

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

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3