7
votes

Conception de modèles basés sur les politiques: Comment accéder à certaines politiques de la classe?

J'ai une classe qui utilise plusieurs politiques modèles. Il s'appelle 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.

Voici le code; C'est un peu long, mais vraiment simple: p> xxx pré>

La partie délicate est ici, dans la fonction Main () code> Fonction: p>

    std::cout << "Dessert: " << *it->get_dessert() << std::endl; // ??


1 commentaires

Hé avez-vous déjà été capable de trouver une solution appropriée pour cela?


3 Réponses :


0
votes

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;
}


3 commentaires

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.



0
votes

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.

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.

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 ?


0 commentaires

3
votes

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.

Ce que vous pourrait faire, utilise une conception réelle basée sur la stratégie, par exemple xxx

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.

Mais de votre description, j'ai l'impression que vous avez réellement besoin abstraite Les classes (c.-à-d. Les classes de base abstrait peuvent être la conception qui a du sens pour vous et non des politiques).


0 commentaires