J'essaie de comprendre ce qu'est la répartition multiple. J'ai lu beaucoup de textes différents mais je n'ai toujours aucune idée de ce qu'est la répartition multiple et de ce à quoi elle sert. Peut-être que la chose qui me manque est un morceau de code utilisant plusieurs dépêches. S'il vous plaît, pouvez-vous écrire un petit morceau de code en C++ en utilisant plusieurs dispatch afin que je puisse voir qu'il ne peut pas être compilé/exécuté correctement parce que C++ n'a qu'une seule distribution? J'ai besoin de voir la différence. Merci.Envoi multiple en C++
Répondre
La répartition multiple permet de choisir la version d'une fonction à appeler en fonction du type d'exécution des arguments transmis à l'appel de fonction.
Voici un exemple qui ne fonctionnera pas droit en C++ (non testé):
class A { };
class B : public A { };
class C : public A { }
class Foo
{
virtual void MyFn(A* arg1, A* arg2) { printf("A,A\n"); }
virtual void MyFn(B* arg1, B* arg2) { printf("B,B\n"); }
virtual void MyFn(C* arg1, B* arg2) { printf("C,B\n"); }
virtual void MyFn(B* arg1, C* arg2) { printf("B,C\n"); }
virtual void MyFn(C* arg1, C* arg2) { printf("C,C\n"); }
};
void CallMyFn(A* arg1, A* arg2)
{
// ideally, with multi-dispatch, at this point the correct MyFn()
// would be called, based on the RUNTIME type of arg1 and arg2
pFoo->MyFn(arg1, arg2);
}
...
A* arg1 = new B();
A* arg2 = new C();
// Using multi-dispatch this would print "B,C"... but because C++ only
// uses single-dispatch it will print out "A,A"
CallMyFn(arg1, arg2);
+1 pour le code qui indique clairement le problème – neuro
Merci, cette réponse est à peu près ce que j'avais besoin de voir.Maintenant, je dois juste savoir, pourquoi diable quelqu'un a besoin d'une telle chose .. Quoi qu'il en soit, je vous remercie pour le bon exemple. – Martin
une application est la physique, un cube entrant en collision avec un autre cube est une intersection, un cube entrant en collision avec un plan est une intersection différente. Par conséquent, vous vous retrouvez avec pas mal de méthodes différentes de détection de collision, et la répartition est très utile pour cela. heres un fil sur double expédition, http://www.gamedev.net/topic/453624-double-dispatch-in-c/ – QuantumKarl
envoi multiple est lorsque la fonction qui est exécuté dépend du type de temps d'exécution de plus d'un objet.
C++ a une répartition unique, car lorsque vous utilisez des fonctions virtuelles, la fonction réelle qui s'exécute dépend uniquement du type d'exécution de l'objet à gauche de -> ou. opérateur.
J'ai du mal à penser à un vrai cas de programmation pour les envois multiples. Peut-être dans un jeu où différents personnages se battent entre eux.
void Fight(Opponent& opponent1, Opponent& opponent2);
Le gagnant d'un combat peut dépendre des caractéristiques des deux adversaires, vous voudrez peut-être cet appel à expédier à l'un des éléments suivants, en fonction des types temps d'exécution des deux arguments:
void Fight(Elephant& elephant, Mouse& mouse)
{
mouse.Scare(elephant);
}
void Fight(Ninja& ninja, Mouse& mouse)
{
ninja.KarateChop(mouse);
}
void Fight(Cat& cat, Mouse& mouse)
{
cat.Catch(mouse);
}
void Fight(Ninja& ninja, Elephant& elephant)
{
elephant.Trample(ninja);
}
// Etc.
La fonction dépend du type des deux arguments, pas d'un seul. En C++, vous devrez peut-être écrire ceci comme des fonctions virtuelles. Une fonction virtuelle serait sélectionnée en fonction d'un argument (le pointeur this). Ensuite, la fonction virtuelle peut avoir besoin de contenir un commutateur ou quelque chose pour faire quelque chose de particulier à l'autre argument.
Dans envoi unique La fonction exécutée dépend uniquement du type d'objet. Dans double répartition la fonction exécutée dépend du type d'objet et d'un paramètre .
Dans l'exemple suivant, la fonction Area()
est appelée à l'aide envoi simple et Intersect()
se fie à l'expédition à double car il faut un paramètre de forme. L'exemple est basé sur cette article.
Voir cet article écrit par B. Stroustrup: Open Multi-Methods for C++
bien que j'ai donné un +1, vous étiez censé mettre un résumé pour cet article ... Aussi l'article ne couvre que la méthode de remplacement, pas tous les cas de répartition multiples. –
- 1. envoi USSD en C#?
- 2. Envoi double en C#?
- 3. Demande HTTP multiple en C#
- 4. Envoi de courrier électronique en C#?
- 5. Envoi d'un email en C# .net
- 6. Envoi Gmail via C#
- 7. A quoi sert l'indirection multiple en C++?
- 8. erreur de définition multiple en C++
- 9. Comment simuler l'héritage multiple en C#
- 10. a besoin d'héritage multiple en Objective C
- 11. C++ héritage multiple
- 12. C# multiple de tri
- 13. Héritage multiple Objective-C
- 14. C++ Héritage multiple Question
- 15. Héritage multiple en javascript
- 16. Interop envoi chaîne de C# à C++
- 17. plus C++ multiple fun héritage
- 18. C# Génériques Problème d'héritage multiple
- 19. C# Envoi Email - Contrôle d'intégrité
- 20. C++: L'héritage multiple avec polymorphisme
- 21. Envoi email en Java
- 22. envoi en ligne MHTML
- 23. Méthode d'assignation multiple en Python
- 24. Envoi de clés à une application inactive en C#/.NET
- 25. Envoi/réception de requêtes/réponses SOAP en C
- 26. Envoi d'une pièce jointe en C# Application Windows
- 27. Lecture d'un périphérique USB et envoi de requêtes, en C#
- 28. Envoi d'un pointeur vers une propriété d'interface en Objective-C
- 29. Envoi de struct via Socket en utilisant JAVA et C++
- 30. commande multiple s'exécutant en cmd?
C++ ne supporte pas directement, mais je suis sûr que vous pouvez en quelque sorte imiter cela. Je n'ai jamais utilisé MD ou même vu un joli design dans d'autres langues qui m'a donné envie d'avoir MD en C++. Les fanboys de Dylan l'énumèrent comme l'une des caractéristiques du langage de Dylan. Mais autant que je puisse dire, ça sent mauvais comme un design parce que le nombre de fonctions que vous pourriez avoir à écrire augmente de façon exponentielle. Je ne voudrais pas écrire autant de fonctions. – sellibitze
Vous avez utilisé MD à chaque fois que vous avez utilisé le modèle 'Visitor'. –
Un exemple simple en utilisant C++ 11: http://ideone.com/lTsc7M – Jarod42