昨日的求教得到了大家的热烈回应,除了要我解释友圈封面之外,也有很多牛人给了很棒的指导意见,其中最为有效的是说使用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指针那完全是没啥难度的事情,不过这也仅仅是猜测,有时间我再深入一点学习下.
能达到我的目的了,再次感谢大神们的指导!