Посмотрел как в 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 сделано так странно (в книжке не ясно)
Здравствуйте, 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 может инстанцироваться списком типов, что совсем не то что нам требуется.
Здравствуйте, 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 от всех типов в списке. Или я тут не прав?
а есть идеи зачем ему такая промежуточная ступень, да еще и не уникальная?