Étant donné le code suivant :
struct Window{
void show();
//stuff
}w1, w2, w3;
struct Widget{
void show();
//stuff
}w4, w5, w6;
struct Toolbar{
void show();
//stuff
}t1, t2, t3;
Je veux show
un tas d'articles :
for (auto &obj : {w3, w4, w5, t1})
obj.show();
Cependant, cela ne compile pas, car le std::initializer_list<T>
dans le for
-La boucle ne peut pas déduire T
et en fait, il n'y a pas vraiment de T
qui conviendrait. Je ne veux pas créer un type d'effacement en raison de la quantité de code nécessaire et de la surcharge inutile du temps d'exécution. Comment puis-je écrire correctement ma boucle pour que le type de obj
est déduit pour chaque élément de la liste conceptuelle séparément ?
9 votes
Utilisez un
tuple
0 votes
@LogicStuff Je ne peux pas vraiment faire que toutes les classes héritent de quelque chose avec un
virtual void show()
il devrait également fonctionner avec.size()
et std-containers.2 votes
La liste est-elle une liste d'exécution ou de compilation ? Vous pouvez toujours développer plusieurs appels à la même fonction. comme ici
1 votes
La solution optimale dépend du fait que la liste des éléments sur lesquels vous voulez itérer est fixe ou variable.
0 votes
Il s'agit d'une liste fixe. En utilisant le lien de @BoBTFish j'ai obtenu ce qui fonctionne à ma satisfaction. Peut-être écrire une réponse ?
1 votes
@nwp il est acceptable de répondre à sa propre question une fois que l'on a compris, et il semble que votre solution soit plutôt différente de celle de Richard Hodge.
2 votes
D'après l'exemple, il semble que Window, Toolbar et Widget doivent être dérivés de Showable. Les réponses avec des modèles variables, bien que fantaisistes, sont l'horreur du point de vue de la maintenance. Peut-être pas cet exemple pris isolément, mais un programme qui comporte des dizaines ou des milliers de ces constructions, ..., je serais hors-jeu.
0 votes
Pour info : j'ai cité cette question dans une autre de mes questions. Profitez-en : stackoverflow.com/questions/34360588/