Modern C++ design 第三章 (上)

本文深入探讨了C++中的模板元编程,重点介绍了typelist的定义、操作和实现,包括计算长度、索引访问、查找、追加、删除、去除重复类型、替换和部分排序等功能。通过实例展示了编译时编程的强大之处。
摘要由CSDN通过智能技术生成

从哪里来看,这章都是这整本书的重中之重: 介绍了模板元编程, 编译期间编程的利器。 同时实现了typelist这个整本书为之基石的类。 虽说模板元编程晦涩难懂, 但是作者以渐进的方式, typelist为例, 将之阐述的条例清楚, 只要有一定的template基础, 还是能够看明白的了。

typelist的目的:  是为了用同样的代码来泛型处理不同类型, 只需要提供一系列的类型,那么就会自动为这一系列类型生成代码。

typlist的定义: 由一系列类型组合而成的list, 为了实现编译期的递归处理, typelist采用了一种递归定义方法:如:

#define LOKI_TYPELIST_1(T1) ::Loki::Typelist<T1, ::Loki::NullType>

#define LOKI_TYPELIST_2(T1, T2) ::Loki::Typelist<T1, LOKI_TYPELIST_1(T2) >

#define LOKI_TYPELIST_3(T1, T2, T3) ::Loki::Typelist<T1, LOKI_TYPELIST_2(T2, T3) >

更大的typelist由比他小1的typelist加一个类型构成。

接下来, 介绍了各种typelist的操作,  作者由简入深, 通过介绍这些操作, 将模板元编程的奥妙展现无遗。

1. 计算长度.  这是一个递归运算, 第一个特化, 意思是当递归到起点, 没有类型的时候, 此时:TList为NullType. 长度=0.第二个特化就是递归定义, 当长度不等于0的时候, 长度= 1 +  去掉头的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 };
        };

从这里可以看出编译期实现的一些特性:

1. Template, 模板提供了编译期的分支语句, 即通过不同的类型或者值(值经过intToType包装,相当于不同的类型), 生成不同的特化版本。相当于实现了不同类型之间的差异性。

2.  数值计算: 编译期间只能使用常量, 所以任何辅助的值都是常量。

3. typedefs , 可以用作定义类型常量, 当然,这个类型定义之后就不能改变了。

由于编译期间没有任何的变量可以使用, 所以只能用递归实现行为了。

2. 索引访问 提供了根据索引得到typelist中的对应类型. 递归方式类似length.

        template <class TList, unsig

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值