Uzyskaj dostęp do członka w strukturze za pomocą zmiennej w C ++

10

Mam strukturę z dwoma członkami, na przykład:

struct DataSet {
    int x;
    int y;
};

... i muszę uzyskać do nich dostęp metodą, ale tylko jedną na raz, na przykład:

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

Dane wyjściowe, które chcę mieć:

16
36

Co powinienem zrobić, gdy muszę rozwiązać taki problem? Czy istnieje typ danych, który może uzyskać dostęp do członka?

Adrian
źródło
Jedyną rzeczą, o której mogę myśleć, jest użycie arytmetyki wskaźników. Możesz przekazać jako element „struct” przesunięcie względem początku struktury. Będzie to zależeć od wielkości członków. Z ints myślę, że możesz zagwarantować, że będą one wyrównane do granic słów, więc możesz przejść dsm = 0do dostępu xi dsm = 4dostępu y, a następnie uzyskać do nich dostęp w podobny sposób int val = int(*(&ds+dsm)).
ocket8888
1
@ ocket8888 c++ma wskaźnik do członków, więc nie ma potrzeby niestandardowych włamań wskaźnika, aby to zadziałało.
super
@eerorika Masz rację. Wcześniej miałem dwa ciągi jako członków, ale zmieniłem je na int. Zapomniałem usunąć „std ::”.
Adrian

Odpowiedzi:

10

Tak, możesz użyć wskaźnika do członka. Składnia dla tego typu to TypeOfMember TypeOfStruct::*i dostęp do ciebiestruct_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
źródło