具有不同签名的绑定功能

时间:2014-04-30 13:56:21

标签: c++ c++11 callback

如果问过这个问题,我道歉。

我认为你不能用不同的签名绑定函数,但看看这个:

void TakesChar(char parameter)
{
    std::cout << parameter << std::endl;
}

using CallSig = void(float);
using CallBack = std::function<CallSig>;

int main()
{
    CallBack callback = std::bind(&TakesChar, std::placeholders::_1);
    callback(1.1f);
    callback(2.2f);

    return 0;
}

编译并运行。您可以尝试不同的参数类型和数字。例如,您可以修改TakesChar,使其不接受任何参数,并且仍然可以编译。

这是为什么?它背后有理由吗?我可以强制签名完全匹配吗?

感谢。

1 个答案:

答案 0 :(得分:1)

实际上,这里有两个问题:

  1. 为什么允许转换?
  2. 为什么如果没有为bind提供参数,返回对象会接受任意数量的参数?
  3. 前者只是对bind行为的决定:因为您可以致电TakesChar(1.1f)为什么不允许std::bind(&TakesChar, _1)绑定到std::function<void(float)>?委员会决定允许它。

    后者,正如评论中所解释的那样,已在SO上得到解决。简而言之,它不仅更容易,而且还允许bind具有多个operator()不同arities的对象。