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