Доступ до члена в структурі за допомогою змінної в C ++


10

У мене є структура з двома членами, наприклад:

struct DataSet {
    int x;
    int y;
};

..., і мені доводиться отримувати доступ до тих методів, але лише один за одним, наприклад:

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

Вихід, який я хочу мати:

16
36

Що робити, коли мені доведеться вирішити подібну проблему? Чи існує тип даних, який може отримати доступ до учасника?


Єдине, що я можу придумати, - це ти міг би використовувати арифметику вказівника. Ви можете передати як "член" структури зміщення відносно початку структури. Це залежало б від чисельності членів. З використанням ints, я думаю, ви можете гарантувати, що вони будуть вирівняні до меж слова, тож ви переходите dsm = 0до доступу xта dsm = 4до доступу y, тоді ви отримаєте доступ до них, як int val = int(*(&ds+dsm)).
ocket8888

1
@ ocket8888 c++має вказівники на членів, тому не потрібно використовувати спеціальні хакерські покажчики, щоб зробити цю роботу.
супер

@eerorika Ви маєте рацію. Раніше в мене були два рядки як члени, але я змінив їх на int. Я забув видалити "std ::".
Адріан

Відповіді:


10

Так, ви можете використовувати вказівник на члена. Синтаксис для типу є TypeOfMember TypeOfStruct::*, і для доступу ви робитеstruct_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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.