您的位置:首页 > 其它

Loki源码阅读之TypeList(未完)

2007-05-24 22:22 351 查看
如果你使用过Boost::tuple,而且阅读过其源码,那么,Typelist在你的面前或许没有任何的神秘感,你可以很轻易的读懂Typelist的源码,但是,Tuple和Typelist的设计目标是完全不一样的.

TypeList的基础代码

    template <class T, class U>
    struct Typelist
    {
       typedef T Head;
       typedef U Tail;
    };

这个代码看起来没有任何可发挥指出,但是alex将这些代码和模板组合起来,就发挥了不可思议的变化.TypeList的产生模板如下:

        template
        <
            typename T1  = NullType, typename T2  = NullType, typename T3  = NullType,
            typename T4  = NullType, typename T5  = NullType, typename T6  = NullType,
            typename T7  = NullType, typename T8  = NullType, typename T9  = NullType,
            typename T10 = NullType, typename T11 = NullType, typename T12 = NullType,
            typename T13 = NullType, typename T14 = NullType, typename T15 = NullType,
            typename T16 = NullType, typename T17 = NullType, typename T18 = NullType
        >
        struct MakeTypelist
        {
        private:
            typedef typename MakeTypelist
            <
                T2 , T3 , T4 ,
                T5 , T6 , T7 ,
                T8 , T9 , T10,
                T11, T12, T13,
                T14, T15, T16,
                T17, T18
            >
            ::Result TailResult;

        public:
            typedef Typelist<T1, TailResult> Result;
        };

        template<>
        struct MakeTypelist<>
        {
            typedef NullType Result;
        };

这个就是Typelist的产生代码,而且是在编译过程中产生的。 主要的技术是使用模板偏特化和模板递归。

所以,我们很容易推导出:

MakeTypelist<a,b,c>::Result = Typelist<a, Typelist<b, Typelist<c, NullType> > >;

同时,alex还提供了对Typelist的操作模板,也是使用模板偏特化和模板递归实现的,如:

        template <class T, class U>
        struct Length< Typelist<T, U> >
        {
            enum { value = 1 + Length<U>::value };
        };
template <class TList, unsigned int index> struct TypeAt;

 template <class TList, class T> struct IndexOf;

  template <class TList, class T> struct Append;

 template <class TList, class T> struct Erase;

template <class TList, class T> struct EraseAll;

 template <class TList> struct NoDuplicates;

 template <class TList, class T, class U> struct Replace;

template <class TList, class T, class U> struct ReplaceAll;

template <class TList> struct Reverse;

template <class TList, class T> struct MostDerived;

template <class TList> struct DerivedToFront;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  class struct c