C++11 bind
阿新 • • 發佈:2017-06-24
mes 引用類型 main 函數綁定 int blog ren bind reference
#include <iostream> #include <functional> using namespace std; int func(int a, int b) { return a + b; } class foo { public: int func(int a, int b) { return a + b; } }; int main() { auto bf1 = std::bind(func, 10, std::placeholders::_1); cout<<bf1(20)<<endl; foo f; auto bf2 = std::bind(&foo::func, f, std::placeholders::_1, std::placeholders::_2); cout<<bf2(100, 50)<<endl; std::function<int (int)> bf3 = std::bind(&foo::func, f, std::placeholders::_1, 100); cout<<bf3(100)<<endl;return 0; }
bind是這樣一種機制,它可以預先把指定可調用實體的某些參數綁定到已有的變量,產生一個新的可調用實體,這種機制在回調函數的使用過程中也頗為有用。
例子中:bf1是把一個兩個參數普通函數的第一個參數綁定為10,生成了一個新的一個參數的可調用實體體; bf2是把一個類成員函數綁定了類對象,生成了一個像普通函數一樣的新的可調用實體; bf3是把類成員函數綁定了類對象和第二個參數,生成了一個新的std::function對象。看懂了上面的例子,下面我們來說說使用bind需要註意的一些事項:
- (1)bind預先綁定的參數需要傳具體的變量或值進去,對於預先綁定的參數,是pass-by-value的
- (2)對於不事先綁定的參數,需要傳std::placeholders進去,從_1開始,依次遞增。placeholder是pass-by-reference的
- (3)bind的返回值是可調用實體,可以直接賦給std::function對象
- (4)對於綁定的指針、引用類型的參數,使用者需要保證在可調用實體調用之前,這些參數是可用的
- (5)類的this可以通過對象或者指針來綁定
C++11 bind