绑定并传递模板化函数调用

时间:2012-03-14 00:57:10

标签: c++ templates stdbind

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

想通过扣除这种类型,我帮了一点: http://ideone.com/mGfUj

也不起作用!我不明白为什么不。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

问题似乎是std::bind在内部传递Callable(它实际上是std::bind<>类型)对象{{1}的评估结果当你在这里第二次传递它时:

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

特别注意:

  

如果std::is_bind_expression<T>::value==true(即另一个std::bind()子表达式在bind的初始调用中用作参数),则会立即调用该bind-subexpression,并且其结果传递给函数。

如果您想延迟评估以便在需要时进行评估,而不是在传递std::bind子表达式时,则必须寻找另一种方法,例如lambda,或者std::function<>对象,仿函数或其他类对象类型,它们都可以调用,并且可以存储一个可以在以后评估的状态。