Acesse um membro em uma estrutura por meio de uma variável em C ++

10

Eu tenho uma estrutura com dois membros, por exemplo:

struct DataSet {
    int x;
    int y;
};

... e eu tenho que acessar aqueles em um método, mas apenas um de cada vez, por exemplo:

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

Saída que gostaria de ter:

16
36

O que devo fazer quando tiver que resolver um problema como este? Existe um tipo de dados que pode acessar um membro?

Adrian
fonte
A única coisa que consigo pensar é que você pode usar a aritmética dos ponteiros. Você pode passar como o "membro" da estrutura um deslocamento em relação ao início da estrutura. Isso dependeria do tamanho dos membros. Com ints, acho que você pode garantir que eles estejam alinhados com os limites das palavras; portanto, você passaria dsm = 0para acessar xe dsm = 4acessar y, e acessaria como gostaria int val = int(*(&ds+dsm)).
ocket8888 01/04
11
O @ ocket8888 c++possui ponteiro para membros, portanto, não há necessidade de hacks de ponteiro personalizados para fazer esse trabalho.
super
@eerorika Você está certo. Anteriormente, eu tinha duas strings como membros, mas as alterei para int. Esqueci de remover o "std ::".
Adrian

Respostas:

10

Sim, você pode usar um ponteiro para membro. A sintaxe para o tipo é TypeOfMember TypeOfStruct::*e, para acessá-lo,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
fonte