當(dāng)我們使用函數(shù)時(shí)習(xí)慣于C函數(shù)的格式,即如下形式
resulttype funname( arglist );
返回值類型 函數(shù)名( 參數(shù)列表 );
在Boost.Function中,我們可以方便的定義定義函數(shù)對(duì)象。不過(guò)在定義用來(lái)表示類成員函數(shù)的函數(shù)對(duì)象時(shí)
第一個(gè)參數(shù)是類指針。而且在調(diào)用時(shí),要傳入一個(gè)類實(shí)例的指針。這樣用起來(lái)并不是很方便,因?yàn)檎{(diào)用者
要知道類實(shí)例。這實(shí)際上沒有實(shí)現(xiàn)解耦。而解耦是我們使用回調(diào)或委托設(shè)計(jì)的一個(gè)目標(biāo)。
為了解決這個(gè)問(wèn)題,我們要使用Boost.Bind庫(kù)
Boost.Bind是一個(gè)函數(shù)對(duì)象工廠。他用來(lái)產(chǎn)生我們需要的函數(shù)對(duì)象。好了,有了它,你可以在你設(shè)計(jì)中大
量使用Boost.Function。不用再去定義類成員函數(shù)形式的函數(shù)對(duì)象啦,只用定義普通函數(shù)對(duì)象。
一個(gè)簡(jiǎn)單的例子
class CExample
{
public:
bool printstr( const std::string &str )
{
std::cout << "CExample::printstr" << str << std::endl;
return true;
}
};
//定義一個(gè)函數(shù)對(duì)象
boost::function< bool ( const std::string& ) > printstr;
//用Boost.Bind創(chuàng)建一個(gè)函數(shù)對(duì)象,賦給printstr
CExample example;
printstr = boost::bind( &CExample::printstr, &example, _1 );
好了,我們創(chuàng)建了一個(gè)函數(shù)對(duì)象,而且調(diào)用時(shí)不再需要類實(shí)例拉。用Boost.Function和Boost.Bind大大
的簡(jiǎn)化了Command模式的實(shí)現(xiàn)。
在上面的例子中要個(gè)古怪的對(duì)象"_1"。這個(gè)叫做站位符,他代表這個(gè)位置有個(gè)參數(shù),但現(xiàn)在還不知道參
數(shù)是什么。_1代表參數(shù)列表中的第一個(gè)位置上的參數(shù)。Boost.Bind一共定義了9個(gè)站位符對(duì)象。如下
_1,_2,_3,_4,_5,_6,_7,_8,_9。分別代表參數(shù)列表中位子。
Boost.Bind產(chǎn)生的函數(shù)對(duì)象可以直接使用,利用上面的例子。
bool b = boost::bind( &CExample::printstr, &example, _1 )( "Hello World" );
posted on 2007-07-20 17:15
walkspeed 閱讀(12856)
評(píng)論(3) 編輯 收藏 引用 所屬分類:
STL、Boost、范型編程 、
C++語(yǔ)言