c++ - c++中函数对象之间不匹配的函数签名

标签 c++

我得到了如下代码片段,并构建了它:

#include <functional>

typedef std::function<void(int)> ReadCallback;

void falseRead() {}

int main()
{
    ReadCallback callback = std::bind(falseRead);
}

ReadCallback 的签名是void(int),而falseRead 的签名是void()。分配如何发生?

如果我使用callback 对象来调用函数,我应该使用哪个语句,callback()callback(0)

最佳答案

绑定(bind)表达式可以用任意数量的参数调用;与占位符不对应的参数将被丢弃。

auto f = std::bind(falseRead);

f(a, b, c);  // equivalent to falseRead();

因此,您的绑定(bind)表达式可用于构造 std::function<void(int)>对象:

std::function<void(int)> g = f;

g(a);  // = f(a) = falseRead()

这是被禁止的相反方向:如果你的绑定(bind)函数接受参数,你必须为参数提供值(绑定(bind)值或占位符):

void realRead(int fd, char* buf);

auto h = std::bind(realRead, _1, buf);  // h(fd) = realRead(fd, buf)
// auto h = std::bind(realRead);        // error

关于c++ - c++中函数对象之间不匹配的函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39135585/

相关文章:

c++ - iostream 或 C++ 中的其他地方是否有称为时间的东西?

C++11 多重移动构造函数调用

c++ - 如何用值 01 重复初始化 vector<bool>?

c++ - 使用模板的 GoogleTest

C++:热图 (BMP) 的数学函数

c++ - 如何根据优先级和关联性解析(复杂的)声明?

c++ - 在 linux 中的 c++ 程序中设置系统日期和时间

c++ - 使用 new 分配静态数组

c++ - 如何将 malloc 返回的指针视为多维数组?

c++ - 如何在 CMake 中添加 "-l"(ell) 编译器标志