Доступ к члену в структуре через переменную в 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

Что мне делать, когда мне нужно решить такую ​​проблему? Есть ли тип данных, который может получить доступ к члену?

Адриан
источник
Единственное, о чем я могу думать, это то, что вы можете использовать арифметику указателей. Вы можете передать в качестве структуры "member" смещение относительно начала структуры. Это будет зависеть от размера членов. Я думаю, что с целочисленными типами вы можете гарантировать, что они будут выровнены по границам слов, поэтому вы переходите 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);
}
Artyer
источник