c++ - 具有不同签名的绑定(bind)函数

标签 c++ c++11 callback

如果有人问过这个问题,我深表歉意。

我以为你不能用不同的签名绑定(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,使其不带任何参数,但仍会编译。

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

谢谢。

最佳答案

其实这里有两个问题:

  1. 为什么允许转换?
  2. 为什么不向 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/

相关文章:

c++ - 如何在 C++ 程序中实现类似于 linux/proc/version 的功能?

c++ - 如何通过某个元素可以在特定专业范围内进行评估?

c++ - 如何在 lambda 的 lambda 函数中捕获 "this"?

javascript - 使用回调创建函数

c++ - cv::Mat_<Type> 分配错误

c++ - C++ 中的 volatile 与 mutable

c++ - 子类化 std::thread 时的潜在竞争

c++ - 本地线程正在为对象的所有实例显示相同的数据

android - 在 Android 中创建类似 Facebook API 的 WebView 弹出窗口

javascript - Livescript,如何结束未嵌套的回调?