如果问过这个问题,我道歉。
我认为你不能用不同的签名绑定函数,但看看这个:
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
,使其不接受任何参数,并且仍然可以编译。
这是为什么?它背后有理由吗?我可以强制签名完全匹配吗?
感谢。
答案 0 :(得分:1)
实际上,这里有两个问题:
bind
提供参数,返回对象会接受任意数量的参数?前者只是对bind
行为的决定:因为您可以致电TakesChar(1.1f)
为什么不允许std::bind(&TakesChar, _1)
绑定到std::function<void(float)>
?委员会决定允许它。
后者,正如评论中所解释的那样,已在SO上得到解决。简而言之,它不仅更容易,而且还允许bind
具有多个operator()
不同arities的对象。