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