1. 程式人生 > >使用std::function和std::bind實現區域性函式做回撥

使用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指標那完全是沒啥難度的事情,不過這也僅僅是猜測,有時間我再深入一點學習下.

能達到我的目的了,再次感謝大神們的指導!