1.GenScatterHierarchy依据typelist生成散乱的继承体系
template <class TList,template <class> class Unit>
class GenScatterHierarchy;

template <class T1,class T2,template <class> class Unit>
class GenScatterHierarchy<LOIK_TYPE_LIST2(T1,T2),Unit>
:public GenScatterHierarchy<T1,Unit>
,public GenScatterHierarchy<T2,Unit>

...{
};

template <class AtomicType,template <class> class Unit>
class GenScatterHierarchy :public Unit<AtomicType>

...{
};

template <template <class> class Uint>
class GenScatterHierarchy<NullType,Unit>

...{
};
让我们首先做点基础的工作,已经知道,子类指针可以向基类转换,这在多重继承的时候一样是可以的。这样对于一个GenScatterHierarchy对象来说,它可以准确任意转化成任何一个基类,唯一的问题是,typelist中某一类型不唯一怎么办?
让我们明白两点,GenScatterHierarchy是类基本的工具,所以对于typelist中类型重复我问题,它也只是生成了同样的一个类,但你必须承认通过不同的路径对同一个类继承了两次。如果你一定要对特定产出路径分选,那你要明白这不同路径的两个类是同一个类,如果你生成了对象,那有两份一样的对象。
获取特定路径产出的对象通用需要编译期推导,很幸运,我们可以,但是你不知道多少次重用了GenScatterHierarchy这个工具(这个类),因为你要找到特定的位置,而这个位置只可通过递归过程中的计数。
template <class TList,template <class> class Unit>
Unit<TList::Head>& FieldHelper(GenScatterHierarchy<TList,Unit>& obj,Int2Type<0>)

...{
GenScatterHierarchy<TList::Head,Unit>& leftBase = obj;
return leftBase;
}

template <int i,class TList,template <class> class Unit>
Unit<TypeAt<TList,i>::Result>& FieldHelper(GenScatterHierarchy<TList,Unit>& obj,Int2Type<i>)

...{
GenScatterHierarchy<TList::Tail,Unit>& rightBase = obj;
return FieldHelper(rightBase,Int2Type<i - 1>());
}

template <int i,class TList,template <class> class Unit>
Unit<TypeAt<TList,i>::Result& Field(GenScatterHierarchy<TList,Unit>& obj)

...{
return FieldHelper(obj,Int2Type<i>());
}
一如你已经见过的手法,但是你可能不明白为什么要如此费力构造这样一个东西,它有什么用呢?er,简单的说,它太有用了,它可以用来定义一个坐标,根据typelist的情况确定是多少维的,你可能对2维和3维比较熟悉。
2.GenLinearHierarchy生成线性继承体系
template <class TList,template <class AtomicType,class Base> class Unit,class Root = EmptyType>
class GenLinearHierarchy;

template <class T1,class T2,template <class,class> class Unit,class Root>
class GenLinearHierarchy<Typelist<T1,T2>,Unit,Root>
:public Unit<T1,GenLinearHierarchy<T2,Unit,Root>

...{};

template <class T,template <class,class> class Unit,class Root>
class GenLinearHierarchy<LOKI_TYPELIST_1(T),Unit,Root>
:public Unit<T,Root>

...{};
其实,我倒觉得这里更直接,因为我们已经非常习惯编译递推的手法了。
GenLinearHierarchy和GenScatterHierarchy的比较:
GenScatterHierarchy使用了多重继承,你可能有多个指向虚函数表的指针,如果你比较关心大小,那使用GenLinearHierarchy是个不错的主意,你消除了多余的虚函数表。