Возникла задача создания шаблона, который будет реализовывать множественное наследование от некоторого набора интерфейсов/классов.
Накатал следующий класс:
template<class T1,class T2,class T3=t_dummy,class T4=t_dummy,class T5=t_dummy>
class t_aggregator:public T1,
public T2,
public T3,
public T4,
public T5
{};
При использовании, получаю ошибку:
Ошибка 1 error C2500: structure::t_aggregator<T1,T2>: 'structure::t_dummy' уже является прямым базовым классом d:\Users\Dima\Work\lib\structure\t_aggregator.h 17
OK. Пробую так:
template<class T1,class T2>
class t_aggregator:public T1,
public T2
{};
template<class T1,class T2,class T3>
class t_aggregator:public T1,
public T2,
public T3
{};
Получаю ошибку (для второго шаблона)
Ошибка 1 error C2977: structure::t_aggregator: слишком много аргументов шаблон d:\Users\Dima\Work\lib\structure\t_aggregator.h 23
Вопрос — как эту задачу лучше всего решить:
— завести кучу t_dummy_1, t_dummy_2 ... t_dummy_N
— сделать уникальным имя агрегатора (по количеству аргументов) — t_aggregator_2, t_aggregator_3 ...
— оставить только агрегратор с двумя параметрами, и рекрусивно через него все прокручивать: t_aggregator<T1,t_aggregator<T2,t_aggregator<T3,T4> > >
— что-то еще?
Собственно вопрос задаю, чтобы свести мысли в кучу — сам сейчас склоняюсь ко второму варианту
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Вопрос — как эту задачу лучше всего решить: КД>- завести кучу t_dummy_1, t_dummy_2 ... t_dummy_N
template<size_t> struct t_dummy {};
template<class T1,class T2,class T3=t_dummy<3>,class T4=t_dummy<4>,class T5=t_dummy<5>>
class t_aggregator:public T1,
public T2,
public T3,
public T4,
public T5
{};
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Возникла задача создания шаблона, который будет реализовывать множественное наследование от некоторого набора интерфейсов/классов.
Можно наследоваться от списка типов двумя способами
class t_dummy {};
template<class T1,class T2,class T3=t_dummy,class T4=t_dummy,class T5=t_dummy>
class t_aggregator:public T1,
public T2,
public T3,
public T4,
public T5
{};
template<class T1,class T2,class T3,class T4>
class t_aggregator<T1, T2, T3, T4, t_dummy>:public T1,
public T2,
public T3,
public T4
{};
template<class T1,class T2,class T3>
class t_aggregator<T1, T2, T3, t_dummy, t_dummy>:public T1,
public T2,
public T3
{};class C1 {};
class C2 {};
int main()
{
t_aggregator<C1, C2> ta;
return 0;
}
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Из ответов, меня приколбасила реализация в бусте... Даже когда засыпал, думал — "ну надо же, а ведь действительно"
а ты пофтыкай на досуге файлики из boost/mpl -- ваще спать перестанешь
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Привет всем.
КД>Возникла задача создания шаблона, который будет реализовывать множественное наследование от некоторого набора интерфейсов/классов.