【问题标题】:Bind and pass around templated function calls绑定和传递模板化函数调用
【发布时间】:2012-03-14 00:57:09
【问题描述】:

这不起作用: http://ideone.com/mUL5Y

认为我在扣除该类型方面有所帮助: http://ideone.com/mGfUj

也不行!我不明白为什么不。

我应该怎么做?

【问题讨论】:

  • 您不能直接将代码复制到帖子中吗?您是在让我们查看 24 行代码的场外源代码吗?
  • @NicolBolas 是的。你得到错误,可以克隆它,玩一下它......这在 irc://chat.freenode.net/##c++ 上被认为是正确的网络礼仪,我认为它在这里也很方便。

标签: c++ templates stdbind


【解决方案1】:

问题似乎是std::bind 在内部传递Callable(实际上是std::bind<> 类型)对象c评估结果时间:

part2(std::bind(&Quux::part3<Callable>, this, 3, c))

它没有像您假设的那样传递 std::bind 对象的未评估版本。

因此,由于您的 f 函数返回 void 类型,c 表达式的结果在内部作为 void 类型传递,而不是未评估的可调用函数对象。因此,当您尝试在Quux::part2 中调用Callable 对象c 时,它又会尝试评估Quux::part3 中的调用c,它不能将可调用对象作为第二个参数传递给Quux::part3 ,因为它传递的类型实际上是 void 类型,而不是可调用类型。

如需进一步参考,请参阅此处:http://en.cppreference.com/w/cpp/utility/functional/bind

特别注意:

如果std::is_bind_expression&lt;T&gt;::value==true(即,另一个std::bind() 子表达式在对bind 的初始调用中用作参数),则立即调用该绑定子表达式并传递其结果到函数。

如果您想延迟评估以便它在您希望的时候发生,而不是在您传递 std::bind 子表达式时,您将不得不寻找另一种方法,例如 lambda 或 @987654344 @ 对象、函子或一些其他类对象类型,它们既可调用又可存储可稍后评估的状态。

【讨论】:

  • 如何评价? c 在任何地方都没有被调用...为什么它会从 void() 变成 void?
  • 当您将std::bind 传递给另一个std::bind 时,会计算第一个子表达式,并将结果 传递给第二个std::bind ...所以如果你评估一个void (*)(int),你最终会得到一个void类型的结果,而不是一个可调用的void(*)(int)。尽管您没有显式调用 c,但实际上是在后台调用它,因为嵌套了 std::bind 表达式,调用的结果是传递的,而不是可调用对象本身。
  • 顺便说一句,如果您使用普通的独立函数而不是类方法,我认为您会更好地了解这种转换发生的位置和方式。 Here is an example with the associated error messages
  • 啊,是的。我现在知道了。谢谢。
  • 问题仍然存在:为什么?这对我来说似乎没有多大意义。
猜你喜欢
  • 2021-11-10
  • 2013-02-13
  • 1970-01-01
  • 2011-11-15
  • 2021-05-12
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
相关资源
最近更新 更多