Jump to content

  • Log In with Google      Sign In   
  • Create Account


GLFW keyboard callback and boost binding


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 KaiserJohan   Members   -  Reputation: 1115

Like
0Likes
Like

Posted 07 October 2012 - 01:31 PM

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

Edited by KaiserJohan, 07 October 2012 - 01:40 PM.


Sponsor:

#2 BitMaster   Crossbones+   -  Reputation: 3883

Like
1Likes
Like

Posted 08 October 2012 - 01:23 AM

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, 08 October 2012 - 01:24 AM.


#3 mrbastard   Members   -  Reputation: 1573

Like
0Likes
Like

Posted 08 October 2012 - 11:48 AM

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 Posted Image

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 Posted Image 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, 08 October 2012 - 11:59 AM.



#4 KaiserJohan   Members   -  Reputation: 1115

Like
0Likes
Like

Posted 09 October 2012 - 10:23 AM

So the best choice is to have a static pointer to the InputManager declared in the source file?




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS