编译期编程的世界(1/3)

  

程序的运行效率是每个程序员都不得不在意的东西,把运行阶段的某些操作转移到编译期处理掉,是美丽的诱惑,我无法抵挡这种诱惑。

在这个世界中,编译阶段推导是核心,毕竟我们能做的事情不多,只能操作常量级别的推导。

1.计算长度

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 };
}
;

在这里采用了偏特化、NullType技术,注意这里模板参数和实际传给类的参数之间的联系和区别,看清区别是正确理解的关键。

2.编译期工具

template提供了编译期间的if选择能力、Integer calculations提供了数值计算能力(但这是一旦确定无法改变的,譬如enum)、typedef提供了类型常数。

3.索引式访问

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;
}
;

这里也是依照模板偏特化提供的选择能力进行的递推。

4.查找typelist

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>::value};
public:
    
enum    { value    = temp == -1 ? -1 : 1 + temp };
}
;

代码贴出来就这样,你可以轻易推敲得到它的原理和使用的技术,但是,难的地方在于这个地方是如何设计出来的,想通这个你可以得到更多。

5.附加
关于附加,er,让我们在代码之前考虑一些事情,编译期间的处理的一个特点是一旦确定无法更改,对于附加而言我们除了重新定义别无它法,那处理方式也显而易见了:

Append < NullType,NullType >                      {typedef NullType Result} ;
Append
< NullType,T >                              {typedef    Typelist<T,NullType>    Result} ;
Append
< NullType,Typelist < Head,Tail >   >          {typedef Typelist<Head,Tail>    Result} ;
Append
< Typelist < Head,Tail > ,T >                  {typedef Typelist<Head,typename Append<Tail,T>::Result    Result} ;

代码已被我简化,注意这里定义新Typelist得重组策略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值