Рассмотрим этот код:VARIADIC Наследование
#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."
}
Так что я хочу, чтобы изменить Person
конструктор
Person (const D<Is...>&) : religion(findDenomination<Is...>()) {}
, который будет выглядеть вверх "стол" статических Religion*
с. В конце концов, 2 человека, принадлежащие к одному и тому же наименованию, должны иметь одинаковое значение Religion*
. Так что это шаблон дизайна мухи, который я пытаюсь реализовать здесь. Проблема в том, что мы не знаем давно, что пакет Is...
(количество суб-суб-деноминаций нигде не фиксировано), поэтому простой многомерный массив не будет работать, я не думаю. Поэтому вместо того, что я делаю, помещают некоторые статические константные векторы Religion*
s в соответствующие классы, а пакет Is...
будет использоваться для поиска конечного вектора для поиска.
Обновление: Есть ли лучшие способы сделать это? Решение, которое я нашел до сих пор, имеет большой недостаток, если вы видите ниже.
Написание 'pray()' as 'prey()' заставило меня улыбнуться. Или вы действительно имели в виду, что они охотятся друг на друга? :-) – dave