2016-08-25 61 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