std::bind和std::function

  std::bind 用於綁定一個函數,返回另一種調用方式的函數對象 ,能夠改變參數順序 和個數,特別是在多線程的程序中,常常用它將函數進行包裝,而後打包發送給工做線程,讓工做線程去執行咱們的任務。ios

  std::function 用於構建一個函數特別是 回調函數  ,用於替代 函數指針/*常和匿名函數一塊兒用回調*/多線程

參考如下代碼:函數

#include<iostream>


#include "functional"

using namespace std;

double calculate(double x, double y, char op)
{
    switch (op)
    {

    case  '+':
    {
                 return x + y;
    }break;

    case  '-':
    {
                 return x - y;
    }break;
    }
    return 0;
}


int main()
{
    
    
    //bind
    auto plus = std::bind(calculate, std::placeholders::_1, std::placeholders::_2, '+');/*calculate 參數1 參數2*/
    auto sub = std::bind(calculate, std::placeholders::_2, std::placeholders::_1, '-');/*calculate 參數2 參數1*/
    cout << plus(5, 2) << endl;
    cout << sub(5, 2) << endl;/*調用時候 5爲 calculate的第二個參數*/


    //function
    typedef    std::function<double(double , double , char)> func;
    func fun = calculate;
    cout << fun(1, 2, '+') << endl;;

    //function ptr
     double (*p)(double, double, char) =calculate;
     cout << p(1, 1, '+') << endl;;


    //function + bind
    std::function<double (double , double )> plus_2;
    plus_2 = plus;
    cout << plus_2(2, 3) << endl;;

    system("pause");
    return 0;

}

 

  bind是這樣一種機制,它能夠預先把指定可調用實體的某些參數綁定到已有的變量,產生一個新的可調 用實體,這種機制在回調函數的使用過程當中也頗爲有用。其實最先在C++98的時候,就已經有了std::bind1st和std::bind2nd分別用來綁定functor的兩個參數,具體代碼就不演示了,查查資料就知道了。這個特性在當時並無引發太多的重視,能夠說是食之無味。
  C++11中提供了std::bind,能夠說是一種飛躍的提高,bind自己是一種延遲計算的思想,它自己能夠綁定普通函數、全局函數、靜態函數、類靜態函數甚至是類成員函數。this

#include <iostream>
#include <functional>
using namespace std;

int TestFunc(int a, char c, float f)
{
    cout << a << endl;
    cout << c << endl;
    cout << f << endl;

    return a;
}

int main()
{
    auto bindFunc1 = bind(TestFunc, std::placeholders::_1, 'A', 100.1);
    bindFunc1(10);

    cout << "=================================\n";

    auto bindFunc2 = bind(TestFunc, std::placeholders::_2, std::placeholders::_1, 100.1);
    bindFunc2('B', 10);

    cout << "=================================\n";

    auto bindFunc3 = bind(TestFunc, std::placeholders::_2, std::placeholders::_3, std::placeholders::_1);
    bindFunc3(100.1, 30, 'C');

    return 0;
}

  從上面的代碼能夠看到,bind可以在綁定時候就同時綁定一部分參數,未提供的參數則使用佔位符表示,而後在運行時傳入實際的參數值。spa

  PS:綁定的參數將會以值傳遞的方式傳遞給具體函數,佔位符將會以引用傳遞。線程

  衆所周知,靜態成員函數其實能夠看作是全局函數,而非靜態成員函數則須要傳遞this指針做爲第一個參數,因此std::bind能很容易地綁定成員函數。指針

  bind最終將會生成一個可調用對象,這個對象能夠直接賦值給std::function對象,而std::bind綁定的可調用對象能夠是Lambda表達式或者類成員函數等可調用對象。它能隨意綁定任何函數,將全部的函數都能統一到std::function。code

相關文章
相關標籤/搜索