Salut,
Voyons si on a bien compris:
On part du principe qu'il existe trois fonctions, que nous pourrions définir sous la forme de
1 2 3 4 5 6 7 8 9 10
|
void a(int i){
std::cout<<"A called with value "<<i<<"\n";
}
void b(int i){
std::cout<<"B called with value "<<i<<"\n";
}
void c(int i){
std::cout<<"C called with value "<<i<<"\n";
} |
(il va de soi que le code que je donne pour ces fonctions devrait être adapté à tes besoins, mais qu'il suffira très bien à pour mon exemple
)
Et que, pour pouvoir les appeler successivement, tu les a placés dans un tableau sous la forme de
std::vector<std::function<void(int)>> functions{&a,&b,&c};
(nécessite l'inclusion du fichier <vector> et du fichier <functional> et l'utilisation de C++11 au minimum pour compiler)
Le plus cohérent est alors d'effectivement utiliser le modulo, qui fourni le reste de la division d'un nombre par un autre pour parcourir ce tableau, mais, d'utiliser le résultat obtenu comme indice du tableau à utiliser, au lieu de l'utiliser dans un test, comme l'avait montré Btkero, par exemple, un code proche de
1 2 3 4 5 6 7
| int main(){
std::vector<std::function<void(int)>> functions{&a,&b,&c};
for(int i = 0; i<15; ++i){
functions[i%3](i);
}
return 0;
} |
provoquera l'affichage
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| a.exe
A called with value 0
B called with value 1
C called with value 2
A called with value 3
B called with value 4
C called with value 5
A called with value 6
B called with value 7
C called with value 8
A called with value 9
B called with value 10
C called with value 11
A called with value 12
B called with value 13
C called with value 14 |
Maintenant, si tu dispose d'un ensemble d'éléments qui doivent servir de paramètre pour l'appel de ces fonctions dont on va considérer que cet ensemble d'éléments est représenté sous la forme de
std::vector<int> elements{3,5,10,15,9,7,2,3,45,32,64,128,35,45,54};
rien de plus simple : il suffira de modifier l'appel pour prendre la valeur qui trouve à l'indice représenté par le compteur, en modifiant un tout petit peu le code pour lui donner la forme de
1 2 3 4 5 6 7 8
| int main(){
std::vector<std::function<void(int)>> functions{&a,&b,&c};
std::vector<int> elements{3,5,10,15,9,7,2,3,45,32,64,128,35,46,54};
for(int i = 0; i<15; ++i){
functions[i%3](elements[i]);
}
return 0;
} |
qui provoquera l'affichage de
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| a.exe
A called with value 3
B called with value 5
C called with value 10
A called with value 15
B called with value 9
C called with value 7
A called with value 2
B called with value 3
C called with value 45
A called with value 32
B called with value 64
C called with value 128
A called with value 35
B called with value 46
C called with value 54 |
Est-ce suffisamment proche de ce que tu cherches à faire
Partager