Loki源码阅读之TypeList(未完)

如果你使用过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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值