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.
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