我認為 boost 的 function / bind 這對組合的 source code
實在是不容易看懂,太辛苦了,比較重要的還是了解怎麼用。介紹
boost 那本書我沒看過(我有點想找人合寫個介紹 boost
的中文書),我自己都是看 boost 網站的 online document 的.
這邊順便寫個範例,回應我前一篇講的 "透過 bind
任意指定其中幾個而成為另一個 boost function(也就是
functor),甚至連順序都可以改變.
例如,原來有個 function:
void f(int , int, char, char, float, float, string, string);
你可以:
function<void(int , int, char, char, float, float, string, string)> f1
= f; // 宣告一個 boost function, 用法與 ff( ) 完全一樣.
function<void(int , int, char, char)> f2 = bind(ff, _1, _2, _3, _4, 0,
0, "av1", "av2"); // 型別為 void (int, int, char, char) 的
function, 使用時會呼叫 f( ), 其 f( )的中第 5, 6, 7, 8
個參數的值被固定為 0, 0, "av1", "av2".
function<void(int , char, float, string)> f3 = bind(ff, _1, -3, _2,
'a', _3, 3.1416, _4, "av"); // 型別為 void (int, char, float,
string) 的 function, 使用時會呼叫 f( ), 其中 ff( )的第 2, 4,
6, 8 個參數的值被固定為 -3, 'a', 3.1416, "av".
function<void(string, float, char, int)> f4 = bind(ff3, _4, _3, _2,
_1); // 型別為 void (string, float, char, int) 的
function,使用時會呼叫 f3( ),其實就是把 f3( )
原來的參數呼叫順序倒過來而已。而 f3( ) 又會呼叫 f(
), 且將它的第 2, 4, 6, 8 個參數的值被固定為 -3, 'a',
3.1416, "av".
使用範例:
呼叫 f3("avhacker", 2.71828183, 'z', 99);
相當於底下這個呼叫
f(99, -3, 'z', 'a', 2.71828183, 3.1416, "avhacker", "av");
當然,連 member function 也可以這樣玩,而且不必要是
static member function,相當的好用。