0

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

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

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

我该怎么做?

4

1 回答 1

1

问题似乎是当您在这里第二次传递对象时,std::bind内部传递了(它实际上是一个类型)对象的评估结果:Callablestd::bind<>c

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

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

因此,由于您的f函数返回一个void类型,因此c表达式的结果在内部作为void类型传递,而不是未评估的可调用函数对象。因此,当您尝试调用inCallable对象cQuux::part2,它又尝试评估调用cin 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<>对象、仿函数或其他一些方法类对象类型,既可调用又可以存储以后可以评估的状态。

于 2012-03-14T03:16:05.343 回答