Tenir compte de ce code:VARIADIC Héritage
#include <iostream>
class Religion {
public:
virtual void pray() = 0;
};
// Example: Denomination<N0,N1,N2,N3> is derived from Denomination<N0,N1,N2> is derived
// from Denomination<N0,N1> is derived from Denomination<N0> is derived from Religion.
template <int...> class Denomination : public Religion {
virtual void pray() {std::cout << "Prays like a ... ?\n";}
};
template <> class Denomination<2> : public Religion {
virtual void pray() override {std::cout << "Prays like a Muslim.\n";}
};
template <> class Denomination<2,0> : public Denomination<2> {
virtual void pray() override {std::cout << "Prays like a Sunni Muslim.\n";}
};
template <> class Denomination<2,0,1> : public Denomination<2,5> {
virtual void pray() override {std::cout << "Prays like a Hanafi Sunni Muslim.\n";}
};
template <int...> struct D {};
class Person {
Religion* religion;
public:
template <int... Is>
Person (const D<Is...>&) : religion(new Denomination<Is...>) {}
// How to get the Flyweight Pattern here?
void pray() {religion->pray();}
};
int main() {
Person* person1 = new Person(D<2,0,1>{}); // "Prays like a Hanafi Sunni Muslim."
Person* person2 = new Person(D<2,0>{}); // "Prays like a Sunni Muslim."
Person* person3 = new Person(D<2>{}); // "Prays like a Muslim."
person1->pray();
person2->pray();
person3->pray();
Person* person4 = new Person(D<2,5,6,2,1,3>{});
person4->pray(); // Should be "Prays like a Hanafi Sunni Muslim."
}
Je veux changer le constructeur Person
à
Person (const D<Is...>&) : religion(findDenomination<Is...>()) {}
qui recherchera une "table" de Religion*
statique s. Après tout, 2 personnes appartenant à la même dénomination devraient partager la même valeur Religion*
. Donc, c'est le modèle de conception mouche que j'essaie de mettre en œuvre ici. Le problème est que nous ne savons pas longtemps le pack Is...
est (le nombre de sous-sous -...- dénominations n'est pas fixé n'importe où), donc un simple tableau multidimensionnel ne fonctionnera pas je ne pense pas. Donc, ce que je fais, c'est placer des vecteurs const statiques de Religion*
dans les classes appropriées et le pack Is...
sera utilisé pour trouver le vecteur final à rechercher.
Mise à jour: Toutes les meilleures façons de le faire? La solution que j'ai trouvée jusqu'ici a un inconvénient majeur si vous voyez ci-dessous.
L'orthographe de 'pray()' comme 'proie()' m'a fait sourire. Ou voulez-vous vraiment dire qu'ils se nourrissent les uns les autres? :-) – dave