谈bind

2021-12-10  本文已影响0人  404Not_Found

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;
}

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

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 参数的位置

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 则不行哟。

上一篇下一篇

猜你喜欢

热点阅读