GLFW keyboard callback and boost binding

Started by
2 comments, last by KaiserJohan 11 years, 6 months ago
Hello,

I have a class "InputManager" in which I want to define the callback function that I later provide to GLFW for keyboard callbacks. I am normally using boost::bind for such tasks, but I for some reason cannot get this one to work, and the compile error I cannot read,

The GLFW callback is described in http://www.glfw.org/...ersGuide276.pdf, 4.2.2, declared


typedef void (GLFWCALL * GLFWcharfun)(int,int);

where GLFWCALL is just empty macro.

My member callback is declared as:

void GLFWCALL glfwCharCallback(int, int);

I try to setup the callback like:

bool InputManager::Init(const EngineSettings& engineSettings)
{
glfwSetCharCallback(boost::bind(&InputManager::glfwCharCallback, this, _1, _1));
return true;
}



To which Visual studio gives me a quite long and generic, syntax error. What am I doing wrong in this case with boost bind?

Thanks
Advertisement
Anything returned by boost::bind or its more limited std equivalents is not a function pointer. It's a (rather complicated) set of templated nested objects.

You will need to use either a free function or a static function in InputManager. I'm not fluent in GLFW but you can probably make InputManager a singleton (because GLFW only supports exactly one window) or there will be some way to store something pointer-like (for storing the this pointer of the relevant instance) as user data.

Anything returned by boost::bind or its more limited std equivalents is not a function pointer. It's a (rather complicated) set of templated nested objects.
You will need to use either a free function or a static function in InputManager.

This is good advice.

I'm not fluent in GLFW but you can probably make InputManager a singleton (because GLFW only supports exactly one window)

Whoa there. I see what you're saying - a free function taking 2 ints is needed, and to forward from said free function to the InputManager class instance requires that the function has/gets a reference to the instance in some way. For a free function to access a class instance that's not one of it's parameters we need some form of global or static access - we agree so far.

But this is a horrible reason to create a singleton. You don't want a singleton, you want a static or global point of access to a class instance. Most (all?) singleton implementations do that as a side-effect, but comes at the horrible cost of introducing a singleton biggrin.png

or there will be some way to store something pointer-like (for storing the this pointer of the relevant instance) as user data.

OK, so you're assuming that one of the ints passed to the callback is this userdata? Maybe it is, but maybe (probably) not - I didn't download GLFW to check either smile.png and the docs don't appear to give any more info on the callback signature.

For my money this is probably a case where an honest-to-goodness global is the right answer.
[size="1"]
So the best choice is to have a static pointer to the InputManager declared in the source file?

This topic is closed to new replies.

Advertisement