Greifen Sie über eine Variable in C ++ auf ein Mitglied in einer Struktur zu

10

Ich habe eine Struktur mit zwei Mitgliedern, zum Beispiel:

struct DataSet {
    int x;
    int y;
};

... und ich muss auf diese in einer Methode zugreifen, aber immer nur auf eine, zum Beispiel:

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

Ausgabe, die ich haben möchte:

16
36

Was soll ich tun, wenn ich ein solches Problem lösen muss? Gibt es einen Datentyp, der auf ein Mitglied zugreifen kann?

Adrian
quelle
Das einzige, woran ich denken kann, ist, dass Sie Zeigerarithmetik verwenden können. Sie können als Struktur "Mitglied" einen Versatz relativ zum Anfang der Struktur übergeben. Dies wäre abhängig von der Größe der Mitglieder. Ich denke, Sie können mit Ints garantieren, dass sie an Wortgrenzen ausgerichtet sind, sodass Sie dsm = 0zum Zugriff xund dsm = 4zum Zugriff übergehen und ydann wie gewünscht darauf zugreifen int val = int(*(&ds+dsm)).
ocket8888
1
@ ocket8888 c++verfügt über Zeiger auf Mitglieder, sodass keine benutzerdefinierten Zeiger-Hacks erforderlich sind, damit dies funktioniert.
Super
@eerorika Du hast recht. Früher hatte ich zwei Zeichenfolgen als Mitglieder, aber ich habe sie in int geändert. Ich habe vergessen, das "std ::" zu entfernen.
Adrian

Antworten:

10

Ja, Sie können einen Zeiger auf ein Mitglied verwenden. Die Syntax für den Typ lautet TypeOfMember TypeOfStruct::*und für den Zugriff tun Sie diesstruct_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
quelle