C++ bind是如何应用于回调函数的
考虑如下的场景,在一个类的start方法中,开了一个线程,这个线程需要绑定到一个函数,这个在这个函数中又要用到类的一些成员变量
class Compositor { public: void start(); Compositor* getComposer() { return mComposer; } void doTask() { printf("do something"\n); } private: Composer* mComposer; thread* mThread; }; void working_thread(void* userdata) { Compositor* compositor = (Compositor*)userdata; compositor->getComposer()->doTask(); } void Compositor::start() { mThread = new thread(working_thread, this); }
然后呢,这个working_thread还要声明为Compositor的友元函数才行,在里面内还要把void*解出来强转成Compositor*, 为了使用类的一些变量还要专门把一些成员通过接口返回出去,这样才能正常使用,总之就是比较麻烦。下面看看bind是如何改善这种情况的
void Compositor::start()
{
auto f = std::bind( &Compositor::doTask, this);
mThread = new thread(f, userdata);
}