c++11:std::bind

全麥Logan發表於2020-12-19

事情是這樣的,
有兩個類,A類中的成員函式要作為B類的回撥函式。
查閱資料發現,c++11之前類的非靜態成員函式,是不能作為回撥函式的,編譯器會報錯。這是因為類的成員函式有一個隱藏的this指標,而回撥函式的函式指標的引數是事先確定的,所以只要之前大部分是使用普通函式或靜態函式作為回撥指標的。

c++11後 std::bind可以解決這個問題。例如:


class A
{
public:
	bool make_callback(int a, std::string& s);//類的非靜態成員函式
}


//宣告函式指標型別,返回值型別bool, 引數型別int和std::string的引用
using callback = std::function<bool(int, std::string&)>;
class B
{
public:
	void setfunc(callback cb)
}

int main()
{
	using std::placeholders::_1;//佔位符
	using std::placeholders::_2;
	B b;
	// 記住,類的成員非靜態函式就用&,傳入的第一個引數必須是this,_1,_2表示回撥函式的顯示的引數
	b.setfunc(std::bind(&A::make_callback,this,_1,_2))
}

參考:
https://blog.csdn.net/sinat_27953939/article/details/97107766
寫的比我這個更詳細。

相關文章