Iteración a través de estructuras y miembros de clase
C proporciona varios mecanismos para iterar a través de miembros de estructuras y clases. Para lograr esto, puede emplear varias técnicas.
Definir la estructura con una macro:
Un enfoque es usar la macro REFLECTABLE, como se ve en el siguiente ejemplo. :
struct A
{
REFLECTABLE
(
(int) a,
(int) b,
(int) c
)
};
Al usar esta macro, puede iterar cómodamente sobre los campos e imprimir sus valores de la siguiente manera:
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);
Adaptación de la estructura como una secuencia Fusion:
Otra opción es adaptar la estructura como una secuencia Boost.Fusion. Considere el siguiente ejemplo:
struct A
{
int a;
int b;
int c;
};
BOOST_FUSION_ADAPT_STRUCT
(
A,
(int, a)
(int, b)
(int, c)
)
Con esta adaptación, puede iterar sobre los campos usando el siguiente código:
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));
}
Estas técnicas le permiten iterar eficazmente a través de estructuras y miembros de clase en C.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3