1. 程式人生 > >C++11 bind

C++11 bind

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