C++11 bind function

C++11標準中的std::bind和std::function是從boost中移植過來的。實踐證明,還是相當好用的,同時它們可以和lamda表達式一起用。

下面我們想想這樣一個問題,比如我有一個類,這個類裏面有一個求加法的成員函數,但是我不想在類裏面實現,想交由外部實現,那麼該採取什麼樣的策略呢 ?此時,我們通常會想到用函數指針。看下面程序。

int addGlobalFun(int _a, int _b)
{
	return _a + _b;
}
struct A
{
	typedef int(*addFunc)(int, int);
	void addfun_A(addFunc fun, int _a, int _b)
	{
		int _s = fun(_a, _b);
		cout <<"sum="<< _s << endl;
	}
};
int main(int argc, char** argv)
{
	A aobj;
	aobj.addfun_A(addGlobalFun, 2, 3);
	return 0;
}

在結構體裏定義了一個addFunc的函數指針,在全局定義了addGlobalFun函數,真正實現加法運算的是addGlobalFun函數,在主函數裏,我們只需要把addGloabal函數地址以及參數傳進去即可。

但是如果我把addGlobalFun函數的實現放在另外一個類裏面呢 ?可能有人會想到把這個類的方法聲明爲static,像這樣:

struct A
{
	typedef int(*addFunc)(int, int);
	void addfun_A(addFunc fun, int _a, int _b)
	{
		int _s = fun(_a, _b);
		cout <<"sum="<< _s << endl;
	}
};

struct B
{
	static int addfun_B(int _a, int _b)
	{
		return _a + _b;
	}
};
int main(int argc, char** argv)
{
	A aobj;
	aobj.addfun_A(B::addfun_B, 2, 3);
	return 0;
}

事實證明,是沒問題的,在A裏面不需要定義類的成員函數指針,因爲static的成員函數系統默認是函數指針,而不是成員函數指針。

但是如果沒有聲明爲static的成員函數,那又該如何呢  ? 在A裏面定義B的成員函數指針addfun_B?據我所知,這種辦法行不通的,因爲在調用函數的時候,必須實例化一個對象,才能調用。

針對這樣的問題,std::function std::bind該登場了。

int AddGlobalFun(int _a, int _b)
{
	return _a + _b;
}
struct A
{
	void addfun_A( function<int(int,int)> fun, int _a, int _b)
	{
		int _s = fun(_a, _b);
		cout <<"sum="<< _s << endl;
	}
};

struct B
{
	 int addfun_B(int _a, int _b)
	{
		return _a + _b;
	}
};
int main(int argc, char** argv)
{
	A aobj;
	aobj.addfun_A(AddGlobalFun, 2, 3);

	B bobj;
	aobj.addfun_A(bind(&B::addfun_B, bobj, placeholders::_1, placeholders::_2), 4, 5);
	return 0;
}

 std::bind第一個參數爲對象函數指針,表示函數相對於類的首地址的偏移量;

 bobj爲對象指針;

  std::placeholders::_1和std::placeholders::_2爲參數佔位符,表示std::bind封裝的可執行對象可以接受兩個參數。

  輸出結果爲:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章