Шаблон множественного наследования
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 27.05.10 13:05
Оценка:
Привет всем.

Возникла задача создания шаблона, который будет реализовывать множественное наследование от некоторого набора интерфейсов/классов.

Накатал следующий класс:
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> > >
— что-то еще?

Собственно вопрос задаю, чтобы свести мысли в кучу — сам сейчас склоняюсь ко второму варианту
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Шаблон множественного наследования
От: remark Россия http://www.1024cores.net/
Дата: 27.05.10 13:13
Оценка: 2 (2) +1
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Вопрос — как эту задачу лучше всего решить:

КД>- завести кучу 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
{};



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Шаблон множественного наследования
От: Кодт Россия  
Дата: 27.05.10 13:33
Оценка: 2 (2)
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Возникла задача создания шаблона, который будет реализовывать множественное наследование от некоторого набора интерфейсов/классов.


Можно наследоваться от списка типов двумя способами
// T1, T2, T3, T4 - нужные базы

struct Your : T1, T2, T3, T4 { ..... }; // плоское наследование

struct tmp4 : T4 {};
struct tmp3 : T3, tmp4 {};
struct tmp2 : T2, tmp3 {};
struct tmp1 : T1, tmp1 {};
struct Your : tmp1 { ..... }; // последовательное наследование

Как сделать последнее рекурсивно на списке типов — догадаться несложно

В boost/mpl есть уже готовое средство
#include <boost/mpl/inherit.hpp>

struct Your : boost::mpl::inherit< T1, T2, T3, T4 > { ..... };
Перекуём баги на фичи!
Re[2]: Шаблон множественного наследования
От: Sni4ok  
Дата: 27.05.10 13:34
Оценка: :)
Здравствуйте, remark, Вы писали:

R>
R>template<class T1,class T2,class T3=t_dummy<3>,class T4=t_dummy<4>,class T5=t_dummy<5>>
R>


вы пробельчик в конце перед '>' забыли
Re: Шаблон множественного наследования
От: Bell Россия  
Дата: 28.05.10 04:36
Оценка: 1 (1)
Здравствуйте, Коваленко Дмитрий, Вы писали:

Можно попробовать специализацию:

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;
}
Любите книгу — источник знаний (с) М.Горький
Re[2]: Шаблон множественного наследования
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 28.05.10 04:44
Оценка: :))
Здравствуйте, Bell, Вы писали:

B>Можно попробовать специализацию:


Что-то подобное Caracrist предложил. Hо потом, почему то, передумал

Из ответов, меня приколбасила реализация в бусте... Даже когда засыпал, думал — "ну надо же, а ведь действительно"

Но сам я решил остановится на незатейливом варианте с t_aggregator_2,..., t_aggregator_N.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: Шаблон множественного наследования
От: Arsenicum Россия  
Дата: 28.05.10 09:42
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, remark, Вы писали:


R>>
R>>template<class T1,class T2,class T3=t_dummy<3>,class T4=t_dummy<4>,class T5=t_dummy<5>>
R>>


S>вы пробельчик в конце перед '>' забыли


Да ну, это же c++0x!
c++0x
Re[3]: Шаблон множественного наследования
От: zaufi Земля  
Дата: 28.05.10 09:47
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Из ответов, меня приколбасила реализация в бусте... Даже когда засыпал, думал — "ну надо же, а ведь действительно"

а ты пофтыкай на досуге файлики из boost/mpl -- ваще спать перестанешь
Re: Шаблон множественного наследования
От: Мишень-сан  
Дата: 06.06.10 09:33
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Привет всем.


КД>Возникла задача создания шаблона, который будет реализовывать множественное наследование от некоторого набора интерфейсов/классов.


Здесь
Автор(ы): Alexander Nikolayenko
Дата: 08.10.2005
Машина с конечным числом состояний (FSM, Finite State Machine, или как принято называть по-русски, конечный автомат, КА) представляет собой одну из наиболее полезных концепций в арсенале разработчика. Существует несколько методик реализации конечных автоматов, но, забегая вперед, хочется сказать, что достойный результат дают только те из них, которые связаны с генерацией кода. Возможности, предоставляемые последней версией стандарта C++ и реализованные в последних версиях компиляторов, позволяют генерировать код во время компиляции основного кода проекта. Это дает возможность избежать использования отдельных утилит или расширений IDE и, оставаясь в рамках единого языка (C++), создавать приемлемые для практического использования реализации КА, которые при этом легко поддерживать и развивать.
в исходниках есть такой шаблон, на базе Loki Typelists.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.