【问题标题】:How do I use tr1 function and bind for functions with changing parameters?如何使用 tr1 函数并绑定具有更改参数的函数?
【发布时间】:2013-03-11 06:43:01
【问题描述】:

我目前正在从 C# 转到 C++ 并重写一些游戏引擎代码,我想我在 tr1 中遇到了困难;本质上,我想要做的是让输入层从触摸屏获取输入,然后触发回调以通知任何侦听该输入的元素。现在 tr1/boost 似乎通过使用 functionbind 使这变得超级简单,但是触发 void() 的回调没有问题,但现在我正在尝试在调用时将参数发送到这些回调(例如枚举)。

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

包含类:

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。我想知道我是否错过了什么,或者我睡眠不足只是让我走错了路?谢谢大家!

【问题讨论】:

  • 正确的语法是function&lt;void (MenuActions)&gt;,而不是function&lt;void (MenuActions action)&gt;
  • MenuScene::handleInputCallback的签名是什么?
  • @juanchopanza 签名是 void handleInputCallback(MenuActions action)
  • 在这种情况下,这个表达式tr1::bind(&amp;MenuScene::handleInputCallback, this, MenuActions::neutral); 给你一个无参数的函数对象function&lt;void(void)&gt;。这意味着@ForEver 的答案看起来是正确的。

标签: c++ boost callback boost-bind tr1


【解决方案1】:

你应该使用占位符

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

然后像这样调用

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

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

【讨论】:

  • 命名空间是std::tr1::placeholders
  • 需要注意的是functionbind已经达到C++11标准,现在是std::functionstd::bindstd::placeholders::_n。
  • 谢谢大家,这正是我所需要的!有两个问题需要详细说明您的答案和 cmets:1)如果我正在进行跨平台开发(Windows Phone、Win8、Android、iOS),现在在 tr1 上使用 std 是否安全? 2) @ForEveR,您介意详细说明您通过_1 时发生了什么吗?这只是一个告诉 tr1 忽略默认值的标志吗?我很好奇,因为我现在可能会在其中更多地实现带有 placeholder 的功能,并且想知道发生了什么。再次感谢!
猜你喜欢
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 2010-10-02
  • 2021-12-04
  • 2011-10-03
相关资源
最近更新 更多