谈bind

作者: 404Not_Found | 来源:发表于2021-12-10 22:18 被阅读0次
    • 作者: 雪山肥鱼
    • 时间:20211211 11:23
    • 目的: 复习 bind

    bind语义:
    bind 用来 将 可调用对象和参数进行绑定。绑定后的结果用std::function进行保存,并延迟调用到我们需要的时候。即回调
    需要

    #include <function>
    
    using namespace std;
    using namespace std::placeholders
    

    function + bind 组合经常一起出现
    bind 的可调用对象包括:
    普通函数
    全局函数
    静态函数
    类静态函数
    甚至类成员函数 (function 绑不了)

    • 绑普通函数
    #include <iostream>
    #include <functional>
    
    using namespace std;
    
    int divide(int x, int y) {
        return x/y;
    }
    
    //bind 绑定的是可调用对象及其参数
    
    int main(int argc, char *argv[])
    {
        auto div = bind(divide, 10,2);
        cout<<div()<<endl;
    
        //cout<<div(20,2)<<endl;//没用了
    
        /*
         * 参数个数不匹配 是存在问题的
        auto div2 = bind(divide, 10);
        cout<<div2(3)<<endl;
        */
    
        //placeholders 出场 是用来占位的
        //auto div2 = bind(divide, placeholders::_1,30);
        auto div2 = bind(divide, 10, placeholders::_1);
        cout<<div2(2)<<endl;
    
        auto div3 = bind(divide, placeholders::_1, placeholders::_2);
        cout<<div3(30,10)<<endl;
    
        //5对应第一个参数,10 对应第二个参数
        auto div4 = bind(divide, placeholders::_2, placeholders::_1);
        cout<<div4(5,10)<<endl;
        return 0;
    }
    

    绑定普通函数,注意占位符,以继绑定参数必须符合绑定对象。

    • 绑定对象与成员函数
      绑成员函数,function 是做不到的
    struct Pair {
        int data;
        double source;
    };
    
    class MyPair {
    public:
        void func() {
            cout<<"class MyPair void func()"<<endl;
        }
        void func1(int x, int y) {
            cout<<"calss MyPair func1()"<<endl;
        }
    };
    
    int main(int argc,char **argv) {
    
        //1. 绑定参k数
        Pair p = {10, 2000};
        auto obj = bind(&Pair::data, p);
        cout<<obj()<<endl;
    
        //2. 绑定成员函数
        MyPair mp;
        auto objfunc = bind(&MyPair::func, mp);
        objfunc();
    
    
        //auto objfuncArg = bind(&MyPair::func1, mp, plachodlers::_1, placholders::_2);
        //objfuncArg(10, 20);
        auto objfuncArg = bind(&MyPair::func1, mp, 10, 20);
        objfuncArg();
    
        return 0;
    }
    

    注意bind 参数的位置

    • 函数
      bind(函数名, 参数1,)

    • 对象:
      构造对象
      bind(要绑定东西,对象(绑定在谁身上),参数1,..)

    • 函数重载情形

    int add(int x, int y) {
        cout<<"int add"<<endl;
        return x+y;
    }
    
    double add(double x, double y) {
        cout<<"double add"<<endl;
        return x+y;
    }
    
    class MyPair
    {
    public:
        int add( int x, int y) {
            cout<<"MyPair::int add"<<endl;
            return x+y;
        }
        double add(double x, double y) {
            cout<<"MyPair::double add"<<endl;
            return x+y;
        }
    };
    
    int main() {
        //绑 函数
        auto funcIntAdd =  bind((int (*)(int, int))add, 10, 10);
        funcIntAdd();
    
        auto funcDoubleAdd = bind((double (*)(double, double))add, 10, 10);
        funcDoubleAdd();
    
        MyPair my;
        auto funcClass = bind((int (MyPair::*)(int, int))&MyPair::add, my, 10, 20);
        funcClass();
        return 0;
    }
    

    多态之 bind + function

    function 无法包装类成员函数,但bind 是可以实现 类成员函数绑定,然后复制给function对象,即实现了间接性的包装。
    bind+function 可以实现接口统一的极大整合

    void foo()
    {
       cout <<"void foo()"<<endl;
    }
    
    void func(int a)
    {
        cout<<"void func(int a)"<<endl;
    }
    
    class Foo
    {
    public:
        void method()
        {
            cout<<"Foo::void method()"<<endl;
        }
        void method2(string s)
        {
            cout<<"Foo::void method2()"<<endl;
        }
    };
    
    class Bar
    {
    public:
        void method3(int a, string s) {
            cout<<"Bar::void method3()"<<endl;
        }
    };
    
    //统一
    function<void(void)> f;
    
    int main() {
    
        f = foo;
        f();
    
        //f = func;//明显有问题 类型不服
        f = bind(func, 100);
        f();
    
        Foo x;
        f =bind(&Foo::method, x);
        f();
        f = bind(&Foo::method2, x, "china");
        f();
        f = bind(&Bar::method3, Bar(), 1, "china");
        f();
    
        return 0;
    }
    
    

    用function<void(void)> f; 去接所有
    函数必须是 public, private 则不行哟。

    相关文章

      网友评论

          本文标题:谈bind

          本文链接:https://www.haomeiwen.com/subject/azzkfrtx.html