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