Calling a C++ function pointer on a specific object instance

前端 未结 10 1879
傲寒
傲寒 2020-12-06 01:25

I have a function pointer defined by:

typedef void (*EventFunction)(int nEvent);

Is there a way to handle that function with a specific ins

10条回答
  •  [愿得一人]
    2020-12-06 02:10

    If you're interfacing with a C library, then you can't use a class member function without using something like boost::bind. Most C libraries that take a callback function usually also allow you to pass an extra argument of your choosing (usually of type void*), which you can use to bootstrap your class, as so:

    
    class C
    {
    public:
      int Method1(void) { return 3; }
      int Method2(void) { return x; }
    
      int x;
    };
    
    // This structure will hold a thunk to
    struct CCallback
    {
      C *obj;  // Instance to callback on
      int (C::*callback)(void);  // Class callback method, taking no arguments and returning int
    };
    
    int CBootstrapper(CCallback *pThunk)
    {
      // Call the thunk
      return ((pThunk->obj) ->* (pThunk->callback))( /* args go here */ );
    }
    
    void DoIt(C *obj, int (C::*callback)(void))
    {
      // foobar() is some C library function that takes a function which takes no arguments and returns int, and it also takes a void*, and we can't change it
      struct CCallback thunk = {obj, callback};
      foobar(&CBootstrapper, &thunk);
    }
    
    int main(void)
    {
      C c;
      DoIt(&c, &C::Method1);  // Essentially calls foobar() with a callback of C::Method1 on c
      DoIt(&c, &C::Method2);  // Ditto for C::Method2
    }
    

提交回复
热议问题