Comment parcourir les membres variables d’une classe C ++

J’essaie actuellement d’effectuer une correction compliquée d’une variable à une série de variables (basées sur la normalisation dans différents espaces de phase) pour certaines données que je lis. Comme chaque correction suit le même processus, je me demandais s’il y aurait Quoi qu’il en soit, faire ceci de manière itérative plutôt que de gérer chaque variable seule (puisque j’en ai besoin pour environ 18 à 20 variables). C ++ peut-il gérer cela? Quelqu’un m’a dit d’essayer cela en python, mais j’ai l’impression que cela pourrait être fait en C ++ d’une certaine manière … Je suis en train de bash un mur!

Pour vous donner une idée, étant donné quelque chose comme:

class VariableClass{ public : //each object of this class represents an event for this particlular data set //containing the following variables double x; double y; double z; } 

Je veux faire quelque chose dans le sens de:

 for (int i=0; i < num_variables; i++) { for (int j=0; j < num_events; j++) { //iterate through events } //correct variable here, then move on to next one } 

Merci d’avance pour tout conseil!!!

Oui, il suffit de mettre toutes vos variables dans un conteneur, comme std::vector , par exemple.

extrait de glm (détail vec3.incl)

 template  GLM_FUNC_QUALIFIER typename tvec3::value_type & tvec3::operator[] ( size_type i ) { assert(i < this->length()); return (&x)[i]; } 

cela se traduirait par votre exemple:

 class VariableClass{ public : //each object of this class represents an event for this particlular data double x; double y; double z; double & operator[](int i) { assert(i < 3); return (&x)[i]; } } VariableClass foo(); foo.x = 2.0; std::cout << foo[0] << std::endl; // => 2.0 

Bien que je recommanderais cette solution, s’il s’agit juste de mathématiques vectorielles.

http://en.cppreference.com/w/cpp/container/vector

Je recommande de passer du temps à lire sur toutes les classes de std. Il existe de nombreux conteneurs et de nombreuses utilisations.

Je suppose que vos variables de membre n’auront pas toutes le même type. Sinon, vous pouvez simplement les jeter dans un conteneur. Si vous utilisez C ++ 11, vous pouvez résoudre ce problème en tuple . Avec certaines métaprogrammations de modèles, vous pouvez simuler une boucle sur tous les éléments du tuple. La fonction std :: tie va construire un tuple avec des références à tous vos membres que vous pouvez “itérer” comme ceci:

 struct DoCorrection { template void operator()(T& t) const { /* code goes here */ } }; for_each(std::tie(x, y, z), DoCorrection()); // see linked SO answer for the detailed code to make this special for_each work. 

Ensuite, vous pouvez spécialiser operator() pour chaque type de variable membre. Cela vous permettra de faire le calcul approprié automatiquement sans garder manuellement les types.

En général, vous ne pouvez pas parcourir les membres sans s’appuyer sur des choses définies par l’implémentation, telles que le remplissage ou la réorganisation de sections avec différents qualificatifs d’access (littéralement, aucun compilateur ne le fait, cela est autorisé).

Cependant, vous pouvez utiliser la généralisation d’un type d’enregistrement: a std::tuple . Itérer un tuple n’est pas simple, mais vous trouverez beaucoup de code qui le fait. Le pire ici est la perte de variables nommées, que vous pouvez imiter avec des membres.

Si vous utilisez Boost, vous pouvez utiliser la macro auxiliaire BOOST_FUSION_ADAPT_STRUCT de Boost.Fusion pour transformer une structure en une séquence Fusion, que vous pourrez ensuite utiliser avec des algorithmes Fusion.