使用std::function和std::bind實現區域性函式做回撥
昨日的求教得到了大家的熱烈迴應,除了要我解釋友圈封面之外,也有很多牛人給了很棒的指導意見,其中最為有效的是說使用std::function加std::bind,今晚我就實驗一下.
這兩個東西是c++11的東西,std::function,抄襲別人的理解就是:
對C++中各種可呼叫實體(普通函式、Lambda表示式、函式指標、以及其它函式物件等)的封裝,形成一個新的可呼叫的std::function物件;讓我們不再糾結那麼多的可呼叫實體。一切變的簡單粗暴。源於http://www.jellythink.com/archives/771
這裡我的理解就是統一了這一類指標的呼叫了,它裡面做了一些轉換工作,使得都能夠正確呼叫.而且我感覺最為強大的是也能支援了局部函式這種東西,不過需要藉助std::bind進行繫結,它的具體用法可以參考上面的那個連結,下面我就演示我自己想要的做法就行了.
上程式碼:
class RTree
{
public:
void searchOverlap(std::function<void(int)>f)
{
f(2);
}
};
class CallRtree
{
public:
virtual void searchRes(int a)
{
this->a = a;
}
void search()
{
RTree rtree;
std::function<void(int)>functional = std::bind(&CallRtree::searchRes, this, std::placeholders::_1);
rtree.searchOverlap(functional);
int v = this->a;
}
private:
int a;
}
int _tmain(intargc, _TCHAR* argv[])
{
CallRtree caller;
caller.search();
}
這裡 我們就可以得到v的值是2 也就是正確地使用區域性函式完成函式回撥.
按照我的理解,那應該就是std::bind完成了實體和函式地址的繫結,因為它的引數裡面既有物件指標,又有函式指標,最後那個引數是引數佔位符,從而製造了一個std::function,然後std::function只要能正確處理那個this指標,那就能完成正確地呼叫了,對於標準庫的東西來說,只要編譯器支援,設定個this指標那完全是沒啥難度的事情,不過這也僅僅是猜測,有時間我再深入一點學習下.
能達到我的目的了,再次感謝大神們的指導!