std::bind用來將可調用對象與其參數一起進行綁定,綁定后的結果可以用std::function(可調用對象包裝器)進行保存,并延遲調用到任何我們需要的時候。
通俗來講,它主要有兩大作用:
(1)將可調用對象與其參數綁定成一個仿函數。
(2)將多元(參數個數為n,n>1)可調用對象轉換成一元或者(n-1)元可調用對象,即只綁定部分參數。
注:std::placeholders為一個占位符,代表這個位置在函數調用時,將被第幾個參數所替代。
void call_when_even(int x, const std::function<void(int)>& f)
{if (x % 2 == 0){f(x);}
}
void output(int x)
{cout << x << endl;
}
void output_add_2(int x)
{cout << x + 2 << endl;
}
//placeholders為占位符的意思,用于函數綁定的時候,缺省函數的占位符
int main()
{{auto fr = std::bind(output, std::placeholders::_1);for (int i = 1; i <= 10; ++i){call_when_even(i, fr);}}{auto fr1 = std::bind(output_add_2, std::placeholders::_1);for (int i = 1; i <= 10; ++i){call_when_even(i, fr1);}}return 0;
}
void output(int x, int y)
{cout << x << " " << y << endl;
}
int main(void)
{std::bind(output, 1, 2)();//輸出1 2std::bind(output, std::placeholders::_1, 2)(1);//輸出1 2std::bind(output, 2, std::placeholders::_1)(1);//輸出2 1//std::bind(output, 1, std::placeholders::_2)(1); error,調用時沒有第二個參數,缺少第二個參數std::bind(output, 2, std::placeholders::_2)(1, 2);//輸出2 2,調用時第一個參數直接被吞并了std::bind(output, std::placeholders::_1, std::placeholders::_2)(10, 20);//10 20std::bind(output, std::placeholders::_2, std::placeholders::_1)(30, 40);//40 30return 0;
}
class Test
{
public:int value = 0;void output(int x, int y){cout << x << " " << y << endl;}
};
int main()
{Test test;/*std::function<void(int, int)> fr = std::bind(&Test::output,std::placeholders::_1, std::placeholders::_2);fr(1, 2);*/std::function<int& (void)> fr_i = std::bind(&Test::value, &test);fr_i() = 123;cout << test.value << endl;return 0;
}
struct Test
{
public:static const int Add(const int& x, const int& y){return x + y;}
};
int main()
{std::function<const int(const int&, const int&)> fr = std::bind(Test::Add, std::placeholders::_1, std::placeholders::_2);cout << fr(11, 44) << endl;return 0;
}struct Test
{
public:template<class T>const T Add(const T& x, const T& y){return x + y;}
};
int main()
{Test test;std::function<const int(const int&, const int&)> fr = std::bind(Test::Add<int>,test,std::placeholders::_1,std::placeholders::_2);cout << fr(10,20) << endl;return 0;
}