Loki库读解-为TypeList添足:最远基类、最近基类、类型的排序

相对于TypeList源码,下面代码还是很简单的,就不多说废话了。

#ifndef TYPELIST_ADD_H
#define TYPELIST_ADD_H

//-------------------------------------------------------------------------------
//Loki库自己的SUPERSUBCLASS_STRICT在DevCpp下编译不过,lokiVC6port提供的版本同下。
//-------------------------------------------------------------------------------
#define SUPERSUBCLASS_STRICT_FIX(T, U) /
    (SUPERSUBCLASS(T, U) && /
    !::Loki::Conversion<const T *, const U *>::sameType)
   
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
template <class TList, class T> struct MostBased;

template <class T>
    struct MostBased<NullType, T>
{
    typedef T Result;
};

template <class Head, class Tail, class T>
    struct MostBased<Typelist<Head, Tail>, T>
{
private:
    typedef typename MostBased<Tail, T>::Result Candidate;
public:
    typedef typename Select<SUPERSUBCLASS(Head, Candidate),
            Head, Candidate>::Result Result;
};

//-------------------------------------------------------------------------       
//-------------------------------------------------------------------------
template <class Tlist, class T> struct NearestBased;

template <class Tlist, class T, class CurNearBase> struct NearestBasedHelper;

template <class Head, class Tail, class T, class CurNearBase>       
    struct NearestBasedHelper<Typelist<Head, Tail>, T, CurNearBase>
{
private:
    typedef typename Select< SUPERSUBCLASS_STRICT_FIX(Head, T) &&
                             SUPERSUBCLASS_STRICT_FIX(CurNearBase, Head),
                            Head, CurNearBase>::Result curnearbase;         //搜索处于两个类之间的类
public:                   
    typedef typename NearestBasedHelper<Tail, T, curnearbase>::Result Result;
};

template <class T, class CurNearBase>       
    struct NearestBasedHelper<NullType, T, CurNearBase>
{
    typedef CurNearBase Result;
};
       
template <class T>                             //保护对空TypeList发生操作。
struct NearestBased<NullType, T>
{
//    typedef T Result;
};

template <class Head, class Tail, class T>
    struct NearestBased<Typelist<Head, Tail>, T>
{
private:
    typedef MostBased<Typelist<Head, Tail>, T>::Result mostbased;   //找到最基类,然后夹杀法。
public:
    typedef typename NearestBasedHelper<Typelist<Head, Tail>, T, mostbased>::Result Result;
};

//-------------------------------------------------------------------------------
//排序完成后,派生类一定在它的基类前面。
//-------------------------------------------------------------------------------
template <class TList> struct Sort;

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

template <class Head, class Tail>
    struct Sort<Typelist<Head, Tail> >
{
private:
    typedef typename MostDerived<Tail, Head>::Result             TheMostDerived;
    typedef typename Replace<Tail, TheMostDerived, Head>::Result L;
public:
    typedef Typelist<TheMostDerived, typename Sort<L>::Result>   Result;
   
};


#endif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值