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

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航