2013-04-15 4 views
1

У меня есть много классов A, которые очень похожи, за исключением их структуры данных, поэтому я хотел бы переместить общий материал в базовый шаблон B. Проблема в том, что параметр шаблона является частью класса наследования, поэтому он приходит после того, как мне нужно передать его в шаблон. Как это может быть достигнуто без перемещения X из A (попытка сохранить инкапсуляцию)?Как создать шаблон суперкласса с собственным типом?

template<class X> 
class B { 
    int somefunction(X a); 
}; 

class A : public B<X> { 
    public: 
    struct X { // different in each class A 
     int x; 
    }; 
}; 

NB: «Члены» А необходимо делегировать на центральный контейнер по причинам архитектуры, так что мне нужно это суб-структуры. Да, я знаю, мне это тоже не нравится, но это невозможно изменить.

+3

Если 'X' является общедоступным внутри' A', что вы инкапсулируете? –

+0

Если 'X' является общедоступным, переместите его за пределы' A' и просто используйте 'B' с различными структурами. нет необходимости в наследовании для усложнения вещей. – andre

+1

Я понимаю инкапсуляцию как совокупность того, что принадлежит вместе, а не как нечто скрывающее. – Daniel

ответ

2

Это не может быть сделано, так как в момент создания баз данных тип все еще не завершен, а вложенный тип не определен. В чем проблема, которую вы пытаетесь решить? Могут быть более простые решения, чем то, что вы пытаетесь.

+0

Созданы классы A и 80% идентичны. Многим из методов все равно, что внутри X, поэтому они хорошо вписываются в базовый класс. То же самое относится к механизму, который делегирует хранение X в центральный контейнер. – Daniel

+0

Можете ли вы изменить инструмент генерации кода для генерации вложенного типа в другом месте? –

+0

Я мог бы, но мне кажется, что грязная, чтобы моя собственная структура была определена вне меня. Вот что я имел в виду с инкапсуляцией. – Daniel

Смежные вопросы