hdqqq

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  35 随笔 :: 0 文章 :: 104 评论 :: 0 Trackbacks

STL, Loki,Boost Functor 比较之 Boost ( )

       在这一部分中 , 要讨论的是 Boost 库中的 Function 的有关功能 , 于前面两篇不同的是 ,Boost 库的规模相对于 Loki STL 来说 , 在规模上大了很多 , 这篇文章中讨论的是 boost 中的 functor 部分 , 写的不好之处 , 欢迎提出意见 . 写作本文使用的是 Boost 1_33_1 版本 , 同时参考了 Boost 文档的 function 部分的说明 .

 

写在前面

Boost Function 功能中 , 用到了 Boost Preprocessor, 在这部分中 Boost 提供的宏预处理功能是很强大的 , 主要的宏功能有 重复生成 (BOOST_PP_REPEAT_FROM_TO), 条件判断 (BOOST_PP_IF), 连接 (BOOST_PP_CAT), 数值比较 (BOOST_PP_GREATER), 参数枚举 (BOOST_PP_ENUM_PARAMS) , 使用这些宏 , 可以按照自己的需要用宏生成模板类或者代码 , 实在是一个很有效而且很创新的功能 , 可以说把预处理器的功能用到了登峰造极的地步 . 不过 , 代价是要花更多的时间在编译上 , 我有一个 18000 行代码的工程 , 在一个头文件中使用了 Preprocessor 产生一些模板代码后 , 编译时间从原先的 4 分钟一下子升到了 8 分多秒 ( 我的机器比较老 ), 最后不得不写了个功能 Proxy , 隔绝 cpp 文件对该头文件的依赖关系才缩短了编译时间 .

TypeTraits typetraits 的功能是在给定一个数据类型后 , 通过 c++ 的模板能力 , 来取得这个关于这个数据类型的相关信息 . Loki 库中 , 也提供了 TypeTrait 功能 . 常用的有 判断是否为指针 , 判断是否为常量 , 判断是否为引用 , 判断是否为数值等 . 在创建模板类或者函数的时候 , 有时候需要根据模板参数的类型对模板进行特化 , 这是一个很重要的辅助功能 ,boost 中也有 typetrait 功能 , functor 生成的过程中 , 也使用了一些 typetrait 的功能 .

 

 

Boost 的的 Functor 的头文件位于 <boost/function.hpp> 文件中 , 有一个很重要的宏

BOOST_FUNCTION_MAX_ARGS 用于 定义 boost 的预处理器展开的 Functor 最多的参数个数 , 缺省的定义为

#define   BOOST_FUNCTION_MAX_ARGS   10

如果有需要扩充 Functor 的参数个数 , 可以在包含 Boost Functor 头文件之前 , 自己定义这个宏的数值 , 但是 , 最多可以到 50, 超过这个数值后 , 需要手工修改 <boost/function/detail/maybe_include.hpp> 中的代码 , Functor 可以使用的参数再进行扩充 .

 

Boost Functor 的展开

       Boost 中使用了预处理元编程提供的叠代头文件的功能 , 反复叠代 <boost/function/function_template.hpp>, 最终生成使用所需要的模板类

 

boost::function < 返回值 ( 参数 [, 参数 ]…)>, 用户可以使用编译器的 /P( 微软 c++ 编译器 ),  -save-temps(gcc 编译器 ) 开查看宏展开后的文件 .

 

 

 

有关 STL Loki 中的 Functor 的前面两篇位于我的另外一个 blog

http://blog.csdn.net/hdqqq/archive/2006/02/07/593877.aspx

http://blog.csdn.net/hdqqq/archive/2006/01/25/588348.aspx

posted on 2006-09-13 21:39 hdqqq 阅读(3925) 评论(1)  编辑 收藏 引用 所属分类: c/c++

评论

# re: STL, Loki,Boost 中Functor比较之Boost库(一)[未登录] 2007-08-14 11:35 梦在天涯
很好,写的很不错!!!我转载了!非常的感谢!再次的感谢!



  回复  更多评论
  


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