Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ Function Callbacks: Cannot convert from a member function to a function signature

I'm using a 3rd party library that allows me to register callbacks for certain events. The register function looks something like this. It uses the Callback signature.

typedef int (*Callback)(std::string);

void registerCallback(Callback pCallback) {
//it gets registered
}

My problem is that I want to register a member function as a callback something like this

struct MyStruct {
    MyStruct();
    int myCallback(std::string str);
};

MyStruct::MyStruct() {
    registerCallback(&MyStruct::myCallback);
}

int MyStruct::myCallback(std::string str) {
    return 0;
}

Of course, the compiler complains, saying

error C2664: 'registerCallback' : cannot convert parameter 1 from 'int (__thiscall MyStruct::* )(std::string)' to 'Callback'

I've been looking at boost libraries like function and bind, but none of those seem to be able to do the trick. I've been searching all over Google for the answer, but I don't even know what to call this, so it hasn't been much help.

Thanks in advance.

like image 694
Jonathan Ross Avatar asked Nov 08 '11 02:11

Jonathan Ross


1 Answers

You're trying to pass a member function pointer as a normal function pointer which won't work. Member functions have to have the this pointer as one of the hidden parameters, which isn't the case for normal functions, so their types are incompatible.

You can:

  1. Change the type of your argument to accept member functions and also accept an instance to be the invoking object
  2. Quit trying to pass a member function and pass a normal function (perhaps by making the function static)
  3. Have a normal function that takes an instance of your class, a member function pointer, and a std::string and use something like boost's bind to bind the first two arguments
  4. Make the callback registration function accept a functor object, or an std::function (I think that's the name)
  5. Numerous other ways which I won't detail here, but you get the drift.
like image 96
Seth Carnegie Avatar answered Sep 20 '22 12:09

Seth Carnegie