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