2016-08-25 57 views
1

之间的不匹配的函数签名我得到这个代码片如下,和它建立:在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)

回答

2

bind-expression可用任意数量的参数调用;抛弃不与占位符对应的参数。

auto f = std::bind(falseRead); 

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

因此,你的结合 - 表达可用于构建std::function<void(int)>对象:

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

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

这是一个的禁止相反的方向:如果绑定函数的参数,则必须为参数提供值(绑定值或占位符):

void realRead(int fd, char* buf); 

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