Search code examples
c++cboostboost-bindlibev

Using boost::bind() across C code, will it work?


Can I use boost::bind(mycallback, this, _1, _2) across C code?

Update

The short answer is no, boost bind does not return a function pointer, which can be called in C code, but a functor (C++ object with overloaded () operator) see answer below.


Solution

  • The best way to do what you want to do is to create a C callback that then calls the boost::function, which is stored in some sort of user memory with new.

    Example:

    void callFunction(void* data)
    {
    
       boost::function<void(void)> *func = (boost::function<void(void)>* ) (data);
       (*func)();
       delete(func);
    }
    

    Then you simply pass this callback and set the user data(however it is specified in libev) to be a copy of your function allocated with new.

    This is how you specify user data with libev: http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#ASSOCIATING_CUSTOM_DATA_WITH_A_WATCH