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);
}