Acceda a un miembro en una estructura a través de una variable en C ++

10

Tengo una estructura con dos miembros, por ejemplo:

struct DataSet {
    int x;
    int y;
};

..., y tengo que acceder a ellos en un método, pero solo uno a la vez, por ejemplo:

void foo(StructMember dsm) { // ("StructMember" does not exist)
    DataSet ds;
    ds.x = 4;
    ds.y = 6;

    std::cout << ds.dsm * ds.dsm << std::endl;
}
foo(x);
foo(y);

Salida que deseo tener:

16
36

¿Qué debo hacer cuando tengo que resolver un problema como este? ¿Hay algún tipo de datos que pueda acceder a un miembro?

Adrian
fuente
Lo único que se me ocurre es que podrías usar la aritmética de puntero. Puede pasar como el "miembro" de la estructura un desplazamiento relativo al comienzo de la estructura. Esto dependería del tamaño de los miembros. Con ints, creo que puede garantizar que se alinearán con los límites de las palabras, por lo que pasaría dsm = 0para acceder xy dsm = 4acceder y, y luego accedería a ellos como int val = int(*(&ds+dsm)).
ocket8888
1
@ ocket8888 c++tiene puntero a miembros, por lo que no hay necesidad de hacks de puntero personalizados para que esto funcione.
súper
@eerorika Tienes razón. Anteriormente tenía dos cadenas como miembros, pero las cambié a int. He olvidado eliminar el "std ::".
Adrian

Respuestas:

10

Sí, puede usar un puntero a miembro. La sintaxis para el tipo es TypeOfMember TypeOfStruct::*, y para acceder a usted, hagastruct_variable.*pointer_variable

using StructMember = int DataSet::*;  // Pointer to a member of `DataSet` of type `int`

void foo(StructMember dsm) {
    DataSet ds;
    ds.x = 4;
    ds.y = 6;

    std::cout << ds.*dsm * ds.*dsm << std::endl;
}

int main() {
    foo(&DataSet::x);
    foo(&DataSet::y);
}
Artyer
fuente