如果有人问过这个问题,我深表歉意。
我以为你不能用不同的签名绑定(bind)函数,但看看这个:
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
,使其不带任何参数,但仍会编译。
这是为什么?这背后有什么道理吗?我可以强制签名完全匹配吗?
谢谢。
最佳答案
其实这里有两个问题:
- 为什么允许转换?
- 为什么不向
bind
提供参数? , 返回对象接受任意数量的参数 ?
前者只是决定bind
的行为: 因为你可以打电话 TakesChar(1.1f)
为什么不允许 std::bind(&TakesChar, _1)
绑定(bind)到 std::function<void(float)>
?委员会决定允许它。
后者,如评论中所述,已在 SO 上得到解决。 .简而言之,它不仅更容易,而且还允许 bind
具有多个 operator()
的对象不同的 arities。
关于c++ - 具有不同签名的绑定(bind)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23390125/