Akses anggota dalam struct melalui variabel dalam C ++

10

Saya memiliki struct dengan dua anggota, misalnya:

struct DataSet {
    int x;
    int y;
};

..., dan saya harus mengaksesnya dalam suatu metode, tetapi hanya satu per satu, misalnya:

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

Output yang saya ingin miliki:

16
36

Apa yang harus saya lakukan ketika saya harus menyelesaikan masalah seperti ini? Apakah ada tipe data yang dapat mengakses anggota?

Adrian
sumber
Satu-satunya hal yang dapat saya pikirkan adalah Anda dapat menggunakan aritmatika pointer. Anda bisa lulus sebagai "anggota" struct struct relatif terhadap awal struct. Ini akan tergantung pada ukuran anggota. Dengan ints, saya pikir Anda bisa menjamin mereka akan disejajarkan dengan batas kata, sehingga Anda dsm = 0dapat mengakses xdan dsm = 4mengakses y, lalu Anda akan mengaksesnya seperti int val = int(*(&ds+dsm)).
ocket8888
1
@ ocket8888 c++memiliki pointer-to-anggota, jadi tidak perlu hacks pointer kustom untuk membuat ini berfungsi.
super
@eerorika Anda benar. Sebelumnya saya memiliki dua string sebagai anggota, tetapi saya mengubahnya menjadi int. Saya lupa menghapus "std ::".
Adrian

Jawaban:

10

Ya, Anda bisa menggunakan pointer-to-member. Sintaks untuk tipe ini TypeOfMember TypeOfStruct::*, dan untuk mengakses Anda lakukanstruct_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
sumber