元编程能力(C++元编程和Boost编程库 (C++ Metaprogramming and Boost MPL )中部)
分类:
c++
boost
发表文章
2009-05-16 03:03 1406人阅读 评论(0) 收藏 举报MPL(Meta-Programming Library)是由David Abrahams和Aleksey Gurtovoy为方便模板元编程而开发的库 ,2003年被Boost吸纳为其中的一员 ,此后又历经一些大幅度修改 ,目前已经相当完善 ,其最新版本于2004年11月发布 。MPL的出现是C++模板元编程发展中的一大创举 ,它提供了一个通用 、高层次的编程框架 ,其中包括了序列(Sequence) 、迭代器(Iterator) 、算法(Algorithm) 、元函数(Metafunction)等多种组件 ,具有高度的可重用性 ,不但提高了模板元编程的效率 ,而且使模板元编程的应用范围得到相当的扩展 。
(一)MPL的组织架构
一个库的组织形式有时候甚至比它的功能还重要 。MPL的作者聪明地借鉴了已经取得巨大成功的STL ,在MPL中保留了许多STL的概念 ,对函数式的编程方式进行了精巧的包装 ,使得任何熟悉STL的程序员都可以轻易地理解MPL的使用方法 。像STL一样,MPL有一个完整的概念体系 ,对组件作了精心的划分 ,组件之间相对独立,接口具有通用性 ,因此将组件之间的依存度和耦合性降低到最小的限度 。
STL和MPL的组件概念对照如下:
STL概念
MPL对应概念
容器(Container)
序列(Sequence)
算法(Algorithm)
算法(Algorithm)
迭代器(Iterator)
迭代器(Iterator)
仿函数(Functor)
元函数类(Metafunction)
配接器(Adaptor)
有View 、Inserter Iterator和相当于仿函数配接器的Binding元函数
配置器(Allocator)
无此概念
标准中没有定义
宏(Macro)
(二)MPL对其他库的依赖
MPL是一个高层次的库 ,它的地位和编译期执行的特殊性决定了它需要一些特殊的辅助设施 ,并对其他库会有所依赖 。
1.Boost的Preprocessor库
Preprocessor库是一个基于宏的元编程库[7] 。预处理器的作用发生在编译以前 ,所以它比MPL所处的地位还要高端 ,能够真正实现代码生成 。它的典型功能是迭代或者枚举相似的代码段 ,减少重复而易写错的代码段 。MPL中不少代码是近似的 ,比如在vector的原始代码中 ,就需要定义n个
vectori { … }
其中i从1迭代到n 。为了减少重复劳动 ,MPL的源代码大量使用自定义和Preprocessor库的宏对重复或具有递推性的内容进行迭代 。不过 ,这也导致源代码难以阅读 。比如上面一段展开后的源代码首先是定义在vector/aux_/numbered.cpp的:
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!