Iteración sobre estructuras y miembros de clase
En C, es posible iterar a través de los miembros de una estructura o clase para recuperar sus nombres y valores. Aquí hay algunos enfoques para lograr esto:
Uso de macros
La macro REFLECTABLE se puede usar para definir estructuras que permitan la introspección. La macro define los miembros de la estructura como una lista de pares de tipo-nombre separados por comas. Por ejemplo:
struct A
{
REFLECTABLE
(
(int) a,
(int) b,
(int) c
)
};
Una vez definida la estructura, puede usar una función de visitante para iterar sobre sus miembros e imprimir sus nombres y valores:
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 estructuras como secuencias de fusión
Otro enfoque es adaptar la estructura como una secuencia de fusión usando la macro BOOST_FUSION_ADAPT_STRUCT. Esta macro define los miembros de la estructura como una secuencia de elementos con el tipo y valor correspondiente. Por ejemplo:
struct A
{
int a;
int b;
int c;
};
BOOST_FUSION_ADAPT_STRUCT
(
A,
(int, a)
(int, b)
(int, c)
)
Una vez adaptada la estructura, puede usar un bucle de rango para iterar sobre los miembros e imprimir sus nombres y valores:
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));
}
Ambos enfoques le permiten realizar una introspección de estructuras y clases, proporcionando acceso a sus miembros y sus valores en tiempo de ejecución.
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