2013-03-11 74 views
1

我目前正在从C#转到C++并重写一些游戏引擎代码,我想我在墙上用tr1;基本上我想要做的是让输入层从触摸屏获取输入,然后发起回调以通知任何监听该输入的元素。现在tr1/boost似乎通过使用函数绑定,但是发射void()是没有问题的回调,但现在我试图发送参数通过这些回调时调用(举例来说)。如何使用tr1函数并通过更改参数绑定函数?

这里的问题是,当我调用绑定,并插入参数时,它不充当占位符,而是充当要传递的永久值。例如我的代码在这里:

包含类:

tr1::function<void (MenuActions action)> callback; 
callback = tr1::bind(&MenuScene::handleInputCallback, this, MenuActions::neutral); 
m_menuUILayer->registerCallback(callback); 

有我创建了一个功能,并将其绑定然后registerCallback通过这个回调到成员类和存储参考意图。这部分的工作,但现在的成员类我可以调用回调但是默认参数总是发送...

会员等级:

if (m_callback) 
{ 
    m_callback(MenuActions::backgroundTouchDown); 
} 

所以在这里,而不是MenuActions :: backgroundTouchDown被发送到回调中的主要包含类,默认MenuActions :: neutral仍在使用中。我想知道我是否错过了一些东西,或者我的睡眠不足只是让我走错了路?多谢你们!

+0

正确的语法是'功能<无效( MenuActions)>',而不是'function '。 – Nawaz 2013-03-11 06:46:47

+0

'MenuScene :: handleInputCallback'的签名是什么? – juanchopanza 2013-03-11 06:57:36

+0

@juanchopanza sig是** void handleInputCallback(MenuActions action)** – JedH 2013-03-11 07:21:30

回答

5

你应该使用占位符

callback = tr1::bind(&MenuScene::handleInputCallback, this, 
tr1::placeholders::_1); 

,然后调用像

if (m_callback) 
{ 
    m_callback(MenuActions::backgroundTouchDown); 
} 

和你的函数handleInputCallback可以有默认参数,默认为MenuActions::neutral

+1

命名空间是'std :: tr1 :: placeholders'。 – juanchopanza 2013-03-11 06:57:09

+0

应该注意的是,'function'和'bind'已经使它符合C++ 11标准,现在是'std :: function','std :: bind'和'std :: placeholders :: _'n。 – 2013-03-11 07:02:58

+0

谢谢你们,这正是我需要的!两个问题来详细说明你的答案和评论:1)如果我正在进行跨平台开发(Windows Phone,Win8,Android,iOS),现在是否可以安全使用std over tr1? ** 2)** @ForEveR,你介意当你通过_1时发生了什么?这只是一个标志,告诉tr1忽略默认?我很好奇,因为我可能会用** placeholder **来实现函数,现在还有很多,并且想知道发生了什么。再次感谢! – JedH 2013-03-11 07:23:00