CG@CPPBLOG

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

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


3.4 计算长度

我们用下面代码来计算typelist长度:
 
template <class TList> struct Length;
template 
<> struct Length<NullType>{
    
enum { value = 0 };
};
template 
< class T, class U>
struct Length< Typelist<T, U> >{
    
enum { value = 1 + Length<U>::value };
};


由Length<T>::value得到的值是一个编译期常数,我们可以用它来定义数组大小,

std::type_info* intsRtti[Length<SignedIntegrals>::value];


这个模板代码依靠递归来完成,第一个版本是一个全特化,第二个版本是一个偏特化。

3.5 间奏曲

这里有一个问题,在上节的Length实现中,我们能否用迭代来取代递归?答案是否定的。因为我们在编译期编程中,可以使用的仅是:template、编译期整数计算、typedef。

1、templates:更明确的说是模板特化,提供编译期的if叙述。
2、整数计算:提供数值计算能力,用以从型别转为数值。但数值是不可改变的。
3、typedef:可视为用来引进“具名的型别常数”。它们也是定义之后就冻结,你不能将typedef定义的符号重新定义为另一个型别。

这些特性决定了我们无法使用迭代。所谓迭代是持有一个迭代器,并改变它,直到某些条件吻合。由于编译期我们没有“可资变化的任何东西”,所以无法实现“迭代”。所以编译期运算只能象那些纯粹函数型语言,使用大量的递归。

posted on 2008-01-05 12:15 cuigang 阅读(285) 评论(0)  编辑 收藏 引用 所属分类: 《C++设计新思维》读书笔记


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