CG@CPPBLOG

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

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


3.6 索引式访问

索引式访问使typelist访问线性化。象在static世界中一样,索引必须是编译期常数。一个带有索引的template声明如下:

template <class TList, unsigned int index >struct TypeAt;


实现如下:

template <class Head, Class Tail>
struct TypeAt<Typelist<Head, Tail>0>{
    typedef Head Result;
};
template 
<class Head, class Tail, unsigned int i>
struct TypeAt<Typelist<Head, Tail>, i>{
    typedef typename TypeAt
<Tail, i-1>::Result Result;
};

如果你试着越界访问,会编译出错。对Typelist进行索引访问,花费的时间和typelist大小有关,但这个时间全部花在编译期。

3.7 查找Typelist

我们用IndexOf来查找Typelist中一个型别,返回其位置,找不到返回-1。

template <class TList, class T> struct IndexOf;
template 
<class T>
struct IndexOf<NullType, T>{
    
enum{value = -1};
};
template 
<class Tail, class T>
struct IndexOf<Typelist<T, Tail>, T>{
    
enum{value = 0;}
};
template 
<class Head, class Tail, class T>
struct IndexOf<Typelist<Head, Tail>, T>{
private:
    
enum{temp = IndexOf<Tail, T>::vale};
public:
    
enum{value = temp == -1 ? -1 : 1+temp};
};

最后一个特化版本用了问号表达式来实现分支判断。

3.8 追加元素至Typelist

修改typelist是不可能的,我们以by value方式传回一个新typelist。

template <class TList, class T> struct Append;
template 
<> struct Append<NullType, NullType>{
    typedef NullType Result;
};
template 
<class T> struct Append<NullType, T>{
    typedef TYPELIST_1(T) Result;
};
template 
<class Head, class Tail>
struct Append<NullType, Typelist<Head, Tail> >{
    typedef Typelist
<Head, Tail> Result;
};
template 
<class Head, class Tail, class T>
struct Append<Typelist<Head, Tail>, T>{
    typedef Typelist
<Head, typename Append<Tail,T>::Result> Result;
};

这个实现比较复杂,特别是最后一个偏特化版本,它递归具现Append,每次递归都将tail和待追加型别传递进去。



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


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