Существует одно примечание: разные экземпляры шаблонов (т.е. классы шаблонов с разными типами в параметрах) имеют разные типы и, следовательно, НЕ являются единым базовым классом.
Если вам нужен полиморфизм, вы будетенеобходимо добавить слой в свой дизайн:
class Bunch
{
public:
virtual void create() = 0;
virtual ~Bunch();
};
template <Dimensions D>
class TBunch: public Bunch
{
private:
typedef Blitz::TinyVector<double,D> Particle;
std::deque<Particle> mParticles;
};
class Bunch2d : public TBunch<TwoDimensions>
{
public:
~Bunch2d();
void create();
};
На другом примечании: protected
следует запретить для атрибутов.
Проблема заключается в соединении, так как protected
выставляетАтрибуты / методы для неизвестного числа классов, оно ничем не отличается от public
в том, что невозможно надежно указать, сколько методов будет затронуто изменением реализации.
Для методов это приемлемо, потому что методыможет поддерживаться обратная совместимость (иногда ценой некоторых хитростей / и т. д., но все же).
Для атрибутов это просто неприемлемо, поскольку атрибут - это деталь реализации, а не интерфейс, и изменение не можетбыть обратно совместимым.
Поэтому я призываю вас НИКОГДА не использовать protected
для атрибута.В этом конкретном случае было бы неплохо учесть фактический доступ к mParticles
в классе шаблона без раскрытия базовой реализации.
Небольшой совет: если вы не можете переключаться между deque
и vector
не нарушая что-либо за пределами класса, который их содержит, у вас возникнет проблема дизайна.