这不起作用:http: //ideone.com/mUL5Y
认为我在扣除该类型方面有所帮助:http: //ideone.com/mGfUj
也不行!我不明白为什么不。
我该怎么做?
问题似乎是当您在这里第二次传递对象时,std::bind
内部传递了(它实际上是一个类型)对象的评估结果:Callable
std::bind<>
c
part2(std::bind(&Quux::part3<Callable>, this, 3, c))
std::bind
它没有像您假设的那样传递对象的未评估版本。
因此,由于您的f
函数返回一个void
类型,因此c
表达式的结果在内部作为void
类型传递,而不是未评估的可调用函数对象。因此,当您尝试调用inCallable
对象c
时Quux::part2
,它又尝试评估调用c
in Quux::part3
,它不能将可调用对象作为第二个参数传递给Quux::part3
,因为它传递的类型实际上是一种void
类型,而不是可调用类型。
如需进一步参考,请参阅此处:http ://en.cppreference.com/w/cpp/utility/functional/bind
特别注意:
如果
std::is_bind_expression<T>::value==true
(即,std::bind()
在对 的初始调用中使用了另一个子表达式作为参数bind
),则立即调用该绑定子表达式并将其结果传递给函数。
如果您想延迟评估以便它在您想要的时候发生,而不是在您传递std::bind
子表达式时发生,您将不得不寻找另一种方法,例如 lambda 或std::function<>
对象、仿函数或其他一些方法类对象类型,既可调用又可以存储以后可以评估的状态。