最佳答案
问题似乎是std::bind
正在内部传递 Callable
的评估结果 (它实际上是一个 std::bind<>
类型)对象 c
当你在这里第二次通过它时:
part2(std::bind(&Quux::part3<Callable>, this, 3, c))
它没有传递 std::bind
的未评估版本像你假设的对象。
因此,由于您的 f
函数返回 void
类型,c
的结果表达式在内部作为 void
传递类型,而不是未评估的可调用函数对象。因此,当您尝试调用 Callable
对象 c
在 Quux::part2
,它又尝试评估调用 c
在 Quux::part3
, 它不能将可调用对象作为第二个参数传递给 Quux::part3
,因为它传递的类型实际上是 void
类型,而不是可调用类型。
如需进一步引用,请参见此处:http://en.cppreference.com/w/cpp/utility/functional/bind
特别注意:
If
std::is_bind_expression<T>::value==true
(i.e., anotherstd::bind()
subexpression was used as an argument in the initial call tobind
), then that bind-subexpression is invoked immediately and its result is passed to the function.
如果你想延迟评估以便它在你想要的时候发生,而不是在你通过 std::bind
时发生子表达式,您将不得不寻找其他方法,例如 lambda 或 std::function<>
对象、仿函数或其他一些类对象类型,既可调用又可存储可在以后评估的状态。
关于c++ - 绑定(bind)并传递模板函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9694506/