使用bind 對函式進行封裝改變函式形參(還能改變函式的形引數量以及順序)
//使用bind 對函式進行封裝改變函式形參(還能改變函式的形引數量以及順序)
#include <iostream>
#include < functional>
using namespace std;
void func(int x,int y,int z) {
cout << "x = " << x << " y = " << y << " z = " << z << endl;
}
template<class T>
void func2(T a, T b, T c) {
cout << "T a = " << a << " T b = " << b << " T c = " <<c<< endl;
}
int main()
{
cout << "原始函式執行" << endl;
func(1, 2, 3);//正常呼叫
cout << "使用bind 繫結 func 並給預設值 4 ,5, 6( func(int x,int y,int z) == func() )" << endl;
cout << "繫結到 auto f f函式將不再有形參" << endl;
auto f = bind(func, 4, 5, 6);//使用bind 繫結 func函式並給值(封裝)並給固定引數
f();
cout << "使用 placeholders::_1 佔位符可以改變函式的形參順序 還可以改變函式的形引數量" << endl;
cout << "func(int x,int y,int z) == func(int)" << endl;
auto f1 = bind(func, placeholders::_1, 5, 6);//使用bind 繫結 func函式並給值(封裝)
f1(5555);
cout << "使用 function類也可以儲存 bind繫結的函式,但是要注意引數數量和 bind繫結的引數數量" << endl;
function<void()> p = bind(func, 7, 8, 9);
p();
function<void(int,int)> p1 = bind(func,11,placeholders::_2,33);
p1(66,99);
cout << "使用 bind函式改變函式的引數順序" << endl;
auto f2 = bind(func,placeholders::_2,placeholders::_1,placeholders::_3);
f2(1,2,3);
cout << "========================================================" << endl;
cout << "使用bind儲存 模板函式會失去模板板書的泛型" << endl;
cout << "使用 auto 儲存 bind封裝的 模板函式" << endl;
auto f3 = bind(func2<double>, 1.1, 2.1, 3.1);
f3();
cout << "使用 function<void(char, char, char)> 儲存 bind封裝的 模板函式" << endl;
function<void(char, char, char)> f4 = bind(func2<char>, placeholders::_2, placeholders::_1, placeholders::_3);
f4('a','b','c');
cout << "========================================================" << endl;
cout << "bind 也可以儲存 []()->{}表示式" << endl;
std::cin.get();
}