C語言的callback function做法只能用函式指標去儲存全域函式,在C++中要用同一招會顯的很不自然,因為全域函式無法封裝到類別當中,而member function則無法直接傳遞函式指標,因為沒連帶物件指標一起傳是沒用的。
於是boost用樣板技巧創造出可以呼叫成員函式的「仿函式」,它將成員函式跟物件的指標封裝在一起,呼叫的人並不需要知道這boost::function的內容物是哪裡來的,裝的是全域函式還是成員函式也不用知道,甚至連這函式實際上到底需要多少個參數也不知道,非常全面的取代了 C語言的 callback function,你只要知道它可以取代函式指標,尤其想實現成員函式的callback function只剩這條路可選。
不過需要注意「仿函式」是用樣板實現的,而樣板魔法只能實作在標頭檔上面,這也不算什麼缺點,跟它帶來的好處相比實在太划算了。
仿函式歷經長時間的演化,已經成為了非常強大的好用工具,在C++11裡面已經成為標準庫成員了。
我的專案裡有個山寨版的仿函式實作,大多功能都有實現了,內容會比boost的原作好懂許多
,還滿有趣的,尤其bind的實作手法相當精彩,運用了繼承、樣板偏特化、多載,感謝boost高手們的貢獻,如果看不懂實作的話無所謂,畢竟那些樣板技巧很少用到。
#include <stdio.h>
#include <functional.hpp>
void MyFunction(int a)
{
printf("%d\n",a);
}
int main()
{
using namespace std::placeholders; // for std::placeholders::_1
std::function<void(int)> func=std::bind(&MyFunction,_1);
func(5);
return 0;
}
沒有留言:
張貼留言