Accedi a un membro in una struttura tramite una variabile in C ++


10

Ho uno struct con due membri, ad esempio:

struct DataSet {
    int x;
    int y;
};

... e devo accedervi in ​​un metodo, ma solo uno alla volta, ad esempio:

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);

Uscita che desidero avere:

16
36

Cosa devo fare quando devo risolvere un problema come questo? Esiste un tipo di dati che può accedere a un membro?


L'unica cosa che mi viene in mente è che potresti usare l'aritmetica del puntatore. È possibile passare come "membro" della struttura un offset relativo all'inizio della struttura. Ciò dipende dalla dimensione dei membri. Con ints penso che tu possa garantire che saranno allineati ai confini delle parole, quindi passeresti dsm = 0per accedere xe dsm = 4per accedere y, quindi accederai come loro int val = int(*(&ds+dsm)).
ocket8888,

1
@ ocket8888 c++ha puntatori ai membri, quindi non c'è bisogno di hack di puntatori personalizzati per farlo funzionare.
super

@eerorika Hai ragione. In precedenza avevo due stringhe come membri, ma le ho cambiate in int. Ho dimenticato di rimuovere "std ::".
Adrian

Risposte:


10

Sì, puoi usare un puntatore al membro. La sintassi per il tipo è TypeOfMember TypeOfStruct::*e accedervistruct_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);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.