J'ai une classe qui utilise plusieurs politiques modèles. Il s'appelle Voici le code; C'est un peu long, mais vraiment simple: p> La partie délicate est ici, dans la fonction plat code> dans l'exemple suivant. Je stocke beaucoup de ces
plat code> es dans un code> vecteur code> (à l'aide d'un pointeur sur une classe de base simple), mais j'aimerais ensuite l'extraire et les utiliser. Mais je ne connais pas leurs types exacts.
Main () code> Fonction: p>
std::cout << "Dessert: " << *it->get_dessert() << std::endl; // ??
3 Réponses :
Vous devrez avoir des fonctions de membre appropriées pour interroger (dans ce cas une surcharge pour le type de dessert concret). Les politiques devraient exposer une manière de découverte. Voici un court exemple:
#include <iostream> using namespace std; struct TA { virtual string foo() { return "TA::foo\n"; } }; struct DTA : TA { virtual string foo() { return "DTA::foo\n"; } }; template <class T> struct C { T t; }; template <class T> ostream& operator <<(ostream& o, C<T> c) { o << c.t.foo(); return o; } int main(int argc, char* argv[]) { C<DTA> c; cout << c; }
Ai-je besoin d'une classe de base pour chaque politique, alors? Si tel est le cas, je pourrais vous débarrasser complètement des modèles de politique et utiliser simplement des classes de base abstraites à la place. Mais je pensais que je ferais mieux d'utiliser des modèles d'efficacité ...
L'exemple me conduit à penser en termes d'agrégation suivant - comme vous le suggérez dans votre commentaire - Héritage.
@dehmann: Non, vous n'avez pas besoin d'une classe de base. Vous avez juste besoin que toutes les classes aient la même signature de méthode. Je pense que vous recherchez un polymorphisme de l'heure de compilation.
Ma compréhension est que les classes de modèles basées sur les politiques ne sont pas très conviviales. Je choisis juste un ancien polymorphisme uni pour ce genre de choses. Je serais intéressé par une solution cependant. P>
Edit: Ce n'est peut-être pas en cas de coïncidence que je ne trouve aucune utilisation de conteneurs STL dans l'ensemble du livre "moderne de dessin moderne" de Alexandrescu. p>
Edit2: Plus de détails sur le frottement entre polymorphisme et généricité peuvent être trouvés ici http: // www.artima.com/cpppsource/type_erasure.html . Vous pouvez peut-être être fait de boost :: n'importe quel objet code>? P>
Ce que vous avez n'est pas exactement design basé sur les politiques IMO ... Si c'était le cas, votre classe aurait dû être appliquée (c'est-à-dire étendue) les politiques.
maintenant, retour à votre question / exemple. Dans votre conteneur, vous stockez une "dashbase *". À droite? À partir de ce moment-là, vous perdez toutes les informations de compilation de la compilation WRT le type réel des objets de la collection. Donc, j'ai bien peur de ce que vous essayez de faire est prudemment impossible. p>
Ce que vous pourrait em> faire, utilise une conception réelle basée sur la stratégie, par exemple p> alors, vous pourriez simplement Utilisez dynamic_cast pour vérifier au moment de l'exécution que vous pouvez convertir votre objet à n'importe quel apéritif / dessert de béton / principal. p> Mais de votre description, j'ai l'impression que vous avez réellement besoin em> abstraite Les classes (c.-à-d. Les classes de base abstrait peuvent être la conception qui a du sens pour vous et non des politiques). P> P>
Hé avez-vous déjà été capable de trouver une solution appropriée pour cela?