"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo puedo iterar sobre estructuras y miembros de clase en C++ para acceder a sus nombres y valores en tiempo de ejecución?

¿Cómo puedo iterar sobre estructuras y miembros de clase en C++ para acceder a sus nombres y valores en tiempo de ejecución?

Publicado el 2024-11-06
Navegar:572

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

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.

Último tutorial Más>

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