Accéder à un membre dans une structure via une variable en C ++

10

J'ai une structure avec deux membres, par exemple:

struct DataSet {
    int x;
    int y;
};

..., et je dois y accéder dans une méthode, mais une seule à la fois, par exemple:

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

Sortie que je souhaite avoir:

16
36

Que dois-je faire lorsque je dois résoudre un problème comme celui-ci? Existe-t-il un type de données pouvant accéder à un membre?

Adrian
la source
La seule chose à laquelle je peux penser est que vous pouvez utiliser l'arithmétique des pointeurs. Vous pouvez passer comme struct "membre" un décalage par rapport au début de la struct. Cela dépendrait de la taille des membres. Avec les ints, je pense que vous pouvez garantir qu'ils seraient alignés sur les limites des mots, donc vous passeriez dsm = 0pour accéder xet dsm = 4pour accéder y, puis vous y accéderiez comme int val = int(*(&ds+dsm)).
ocket8888
1
@ ocket8888 c++a un pointeur vers des membres, donc pas besoin de hacks de pointeur personnalisés pour que cela fonctionne.
super
@eerorika Vous avez raison. Auparavant, j'avais deux chaînes en tant que membres, mais je les ai changées en int. J'ai oublié de supprimer le "std ::".
Adrian

Réponses:

10

Oui, vous pouvez utiliser un pointeur vers un membre. La syntaxe du type est TypeOfMember TypeOfStruct::*, et pour y accéder, vousstruct_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
la source