1. 程式人生 > >使用bind 對函式進行封裝改變函式形參(還能改變函式的形引數量以及順序)

使用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();
}