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

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 taodm 的 blog

相对于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

本文关键:《Modern C++ Design》 Loki TypeList
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top