Loki и генераторы иерархий
От: PoM-PoM 40mm Россия  
Дата: 23.02.05 06:40
Оценка:
Посмотрел как в Loki сделаны генераторы иерархий и задался вопросом: а зачем лишняя ступень(слева), почему нельзя сделать наследование напрямую от юнита:

template <class TList, template <class> class Unit>
    class GenScatterHierarchy;
     
    template <class T1, class T2, template <class> class Unit>
    class GenScatterHierarchy<Typelist<T1, T2>, Unit>
        : public Unit<T1>,
          public GenScatterHierarchy<T2, Unit>
    {
    public:
        typedef Typelist<T1, T2> TList;
        typedef Unit<T1>, LeftBase;
        typedef GenScatterHierarchy<T2, Unit> RightBase;
        template <typename T> struct Rebind
        {
            typedef Unit<T> Result;
        };
    }; 
    
    template <template <class> class Unit>
    class GenScatterHierarchy<NullType, Unit>
    {
        template <typename T> struct Rebind
        {
            typedef Unit<T> Result;
        };
    };


Вроде как то логичнее получается. Потом подумал, а как вытащить i-й юнит, если в списке типов есть повторяющиеся? Попробовал через Field<i> и не получилось, что понятно: в дереве несколько Unit<T_i> так и несколько GenScatterHierarchy<T_i,Unit> и оператор приведения не работает! Ага чешим репу, и делаем слева уникальный класс, передав ему параметром оставшуюся длину списка типа


    template <class TList, template <class> class Unit>
    class VladScatterHierarchy;

    template<class Adapter,int i> class VladAdapter:public Adapter // для уникальности в дереве
     {
       public:
        typedef Adapter Result;
     };

    template <class T1, class T2, template <class> class Unit>
    class VladScatterHierarchy<Typelist<T1, T2>, Unit>
        : public VladAdapter<Unit<T1>, TL::Length<Typelist<T1, T2> >::value>, public VladScatterHierarchy<T2, Unit>
    {
    public:
        typedef Typelist<T1, T2> TList;
        typedef VladAdapter<Unit<T1>, TL::Length<Typelist<T1, T2> >::value>  LeftBase;
        typedef VladScatterHierarchy<T2, Unit> RightBase;
        template <typename T> struct Rebind
        {
            typedef Unit<T> Result;
        };
    };

    template <template <class> class Unit>
    class VladScatterHierarchy<NullType, Unit>
    {
        template <typename T> struct Rebind
        {
            typedef Unit<T> Result;
        };
    };

   template <class H,int i>
   struct FieldGetter
    {
       typedef typename TL::TypeAt<typename H::TList, i>::Result ElementType;
       typedef typename H::template Rebind<ElementType>::Result UnitType;

       typedef H::RightBase RightBase;

       static UnitType&  Do(H &obj)
        {
          RightBase& rightBase = obj;
          return  FieldGetter<RightBase, i - 1>::Do(rightBase);
        }
    };

   template <class H>
   struct FieldGetter<H,0>
    {
       typedef typename  H::TList::Head ElementType;
       typedef typename  H::template Rebind<ElementType>::Result UnitType;

       typedef H::LeftBase LeftBase;

       static UnitType&  Do(H &obj)
        {
          LeftBase& leftBase = obj;
          return  leftBase;
        }
    };

   template <int i, class H>
   typename FieldHelper<H, i>::UnitType&
    VField(H& obj)
    {
        return FieldHelper<H, i>::Do(obj);
    }


Может кто объснить почему в Loki сделано так странно (в книжке не ясно)
Will give me piece of mind
Re: Loki и генераторы иерархий
От: korzhik Россия  
Дата: 23.02.05 20:49
Оценка:
Здравствуйте, PoM-PoM 40mm, Вы писали:

PP4>Посмотрел как в Loki сделаны генераторы иерархий и задался вопросом: а зачем лишняя ступень(слева), почему нельзя сделать наследование напрямую от юнита:


PP4>template <class TList, template <class> class Unit>
PP4>    class GenScatterHierarchy;
     
PP4>    template <class T1, class T2, template <class> class Unit>
PP4>    class GenScatterHierarchy<Typelist<T1, T2>, Unit>
PP4>        : public Unit<T1>, // (1)
PP4>          public GenScatterHierarchy<T2, Unit>


Задача GenScatterHierarchy сгенерить класс который наследуется от всех классов, полученных инстанцированием Unit'а
всеми типами из типа списков.
А у тебя что получается?
Если я правильно понял, получается что в (1) Unit может инстанцироваться списком типов, что совсем не то что нам требуется.
Re[2]: Loki и генераторы иерархий
От: Pom  
Дата: 24.02.05 03:09
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, PoM-PoM 40mm, Вы писали:


PP4>>Посмотрел как в Loki сделаны генераторы иерархий и задался вопросом: а зачем лишняя ступень(слева), почему нельзя сделать наследование напрямую от юнита:


K>
PP4>>template <class TList, template <class> class Unit>
PP4>>    class GenScatterHierarchy;
     
PP4>>    template <class T1, class T2, template <class> class Unit>
PP4>>    class GenScatterHierarchy<Typelist<T1, T2>, Unit>
PP4>>        : public Unit<T1>, // (1)
PP4>>          public GenScatterHierarchy<T2, Unit>
K>


K>Задача GenScatterHierarchy сгенерить класс который наследуется от всех классов, полученных инстанцированием Unit'а

K>всеми типами из типа списков.
K>А у тебя что получается?
K>Если я правильно понял, получается что в (1) Unit может инстанцироваться списком типов, что совсем не то что нам требуется.

Почему? Я думал что в списке типов считается, что голова сама не является списком типов. Или это не так?
На мой взгляд если ни один Head с списке типов не является списком типов, то получившийся класс является потомком от инстанцирований шаблона Unit от всех типов в списке. Или я тут не прав?
Re[3]: Loki и генераторы иерархий
От: korzhik Россия  
Дата: 24.02.05 07:15
Оценка:
Здравствуйте, Pom, Вы писали:

K>>Задача GenScatterHierarchy сгенерить класс который наследуется от всех классов, полученных инстанцированием Unit'а

K>>всеми типами из типа списков.
K>>А у тебя что получается?
K>>Если я правильно понял, получается что в (1) Unit может инстанцироваться списком типов, что совсем не то что нам требуется.

Pom>Почему? Я думал что в списке типов считается, что голова сама не является списком типов. Или это не так?

Да, ты прав. Сейчас посмотрел в исходники Loki, действительно получается что Head всегда не является списком типов.
Re[4]: Loki и генераторы иерархий
От: PoM-PoM 40mm Россия  
Дата: 25.02.05 02:27
Оценка:
а есть идеи зачем ему такая промежуточная ступень, да еще и не уникальная?
Will give me piece of mind
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.