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

本文介绍了使用模板元编程在编译期实现的各种实用功能,包括计算类型列表长度、索引式访问、查找类型列表中的索引及类型列表的附加等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  

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

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

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、付费专栏及课程。

余额充值