Sign in to follow this  

GLFW keyboard callback and boost binding

This topic is 1926 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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 [url="http://www.glfw.org/GLFWUsersGuide276.pdf"]http://www.glfw.org/...ersGuide276.pdf[/url], 4.2.2, declared

[CODE]
typedef void (GLFWCALL * GLFWcharfun)(int,int);
[/CODE]
where GLFWCALL is just empty macro.

My member callback is declared as:

[CODE]void GLFWCALL glfwCharCallback(int, int);[/CODE]

I try to setup the callback like:

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


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 Edited by KaiserJohan

Share this post


Link to post
Share on other sites
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. Edited by BitMaster

Share this post


Link to post
Share on other sites
[quote name='BitMaster' timestamp='1349680983' post='4987888']
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.
[/quote]
This is good advice.
[quote name='BitMaster' timestamp='1349680983' post='4987888']
I'm not fluent in GLFW but you can probably make InputManager a singleton (because GLFW only supports exactly one window)
[/quote]
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 [img]http://public.gamedev.net//public/style_emoticons/default/biggrin.png[/img]
[quote name='BitMaster' timestamp='1349680983' post='4987888']
or there will be some way to store something pointer-like (for storing the this pointer of the relevant instance) as user data.
[/quote]
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 [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img] 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. Edited by mrbastard

Share this post


Link to post
Share on other sites
Sign in to follow this