Loki源码阅读之TypeList(未完)
2007-05-24 22:22
351 查看
如果你使用过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;
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;
相关文章推荐
- Nginx源码阅读(ngx_list_t)
- 【JDK源码阅读5-util】Collection-List---Vector
- java源码阅读系列-LinkedList
- STL源码阅读-list
- 非典型2D游戏引擎 Orx 源码阅读笔记(4) 用C实现的基本容器(List,HashTable,Tree)
- JDK源码阅读——ArrayList\LinkedList
- List源码阅读
- Hot to use typelist of Loki??
- spark源码阅读笔记Dataset(三)structField、structType、schame
- [Chrome源码阅读] 理解ObserverList类的实现技巧
- Redis源码阅读笔记—adlist
- 关于模板偏特化,模板递归,及Loki之Typelist和一些感悟
- JDK源码阅读之List和AbstractSequentialList
- java LinkedList源码阅读记录
- jdk源码阅读之AbstractList
- LinkedList源码阅读笔记
- JDK源码阅读之List接口
- 使用c++11改写loki的TypeList
- SGI_STL slist 源码阅读笔记
- javase基础回顾(二)LinkedList需要注意的知识点 阅读源码收获