CG@CPPBLOG

/*=========================================*/
随笔 - 76, 文章 - 39, 评论 - 137, 引用 - 0
数据加载中……

《C++设计新思维》读书笔记(17)


3.2 定义Typelists
1 
2 template <class T, class U>
3 struct Typelist
4 {
5     typedef T head;
6     typedef U Tail;
7 };


Typelists内部没有任何数值:它的实体是空的。它们存在的理由只是为了携带型别信息。因此,对typelist的任何处理都发生在编译期。此后我们提到一个typelist,指的是一个型别而非一个对象。虽然typlist只有两个参数,但我们可以把任意一个替换为另一个typelist,来达到无限延伸的目的。

另外我们需要一个零个型别以及一个型别的typelist。对于零个型别,前面提到的NullType就可以,对于一个型别,我们可以这样定义:

1 typedef Typelist<int, NullType> OneTypeOnly;


3.3 将Typelist生成线性化

像这样一个typelist
1
2 typedef Typlist<int, Typelist<int, Typelist<int, Typelist<intint> > > > Int4Type;


它太Lisp了,我们定义一系列的宏来完成它,这样我们可以忘记尖括号间的空格。

1 #define TYPELIST_1(T1) Typelist<T1, NullType>
2 #define TYPELIST_2(T1, T2) Typelist<T1, TYPELIST_1(T2) >
3 #define TYPELIST_3(T1, T2, T3) Typelist<T1, TYPELIST_2(T2, T3) >
4 #define TYPELIST_4(T1, T2, T3, T4) Typelist<T1, TYPELIST_3(T2, T3, T4) >
5 //etc
6 #define TYPELIST_50(/* */) //


这样前面的 Int4Type 就可以这样定义

1 typedef Int4Type TYPELIST_4(intintintint) Int4Type;


这只是包装手法的一个开端。我们访问Int4Type的最后一个元素还比较麻烦,需要

1 Int4Type::Tail::Tail::Tail;


我们还要进一步来考虑它操作的问题。


 

posted on 2007-12-29 22:08 cuigang 阅读(290) 评论(0)  编辑 收藏 引用 所属分类: 《C++设计新思维》读书笔记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理