c++bind函數的用法


bind函數:

  auto newCallable = bind(callable, arg_list);

  callable依據手冊可以是:

  Callable object (function object, pointer to function, reference to function, pointer to member function, or pointer to data member) that will be bound to some arguments.

bind函數簡述: 

  bind函數看做一個通用的函數適配器,它接受一個可調用對象callable,生成一個新的可調用對象newCallable。

  它可以把原可調用對象callable的某些參數預先綁定到給定的變量中(也叫參數綁定),然后產生一個新的可調用對象newCallable。

網絡編程中, 經常要使用到回調函數。 當底層的網絡框架有數據過來時,往往通過回調函數來通知業務層。 這樣可以使網絡層只專注於 數據的收發, 而不必關心業務

在c語言中, 回調函數的實現往往通過函數指針來實現。 但是在c++中 , 如果回調函數是一個類的成員函數。這時想把成員函數設置給一個回調函數指針往往是不行的

因為類的成員函數,多了一個隱含的參數this。 所以直接賦值給函數指針肯定會引起編譯報錯。

bind函數用法:

一、普通函數

#include <iostream>
#include <memory>
#include <functional>

using namespace std::placeholders;
using namespace std;

void fun1(int n1, int n2, int n3)
{
    cout << n1 << " " << n2 << " " << n3 << endl;
}

int main()
{
    //原fun1接受三個參數,其中綁定了2個,第三個參數由新的可調用對象指定  
    auto f1 = bind(fun1, 11, 22, _1); 
    f1(33);                                                                                                                                  
}

二、普通函數與_1、_2

#include <iostream>
#include <memory>
#include <functional>

using namespace std::placeholders;
using namespace std;

void fun1(int n1, int n2, int n3)
{
    cout << n1 << " " << n2 << " " << n3 << endl;
}

int main()
{
    //_1表示這個位置是新的可調用對象的第一個參數的位置
    //_2表示這個位置是新的可調用對象的第二個參數的位置  
    auto f1 = bind(fun1, _2, 22, _1);
    f1(44,55);
}

三、成員函數

#include <iostream>
#include <memory>
#include <functional>

using namespace std::placeholders;
using namespace std;

class A
{
public:
    void print(int n1, int n2, int n3)
    {
        cout << n1 << " " << n2 << " " << n3 << endl;
    }
};


int main()                                                                                                                                   
{
    A a;
    //類成員函數需要綁定該類的this指針  
    auto f1 = bind(&A::print, &a, _2, 22, _1);
    f1(44,55);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM